Tesseract.js (JavaScript OCR) 識別1D條形碼下面的數字

在做條形碼識別的時候,有可能碰到條形碼因爲被破壞,無法識別的情況。通常1D條形碼的下面都印着對應的數字。這個時候還可以藉助下OCR。雖然OCR的成功率可能不高,但是多一種識別方法也是好的。這裏分享下如何用Tesseract.js來識別一張1D條形碼。

如何使用Tesseract.js

使用npm的命令安裝Tesseract.js:

npm install tesseract.js

獲取示例代碼:
https://github.com/naptha/tesseract.js/tree/master/examples

簡單的運行下這些示例代碼會發現第一次運行速度很慢,原因是需要下載語言包。要加快速度可以參考https://github.com/jeromewu/tesseract.js-offline的示例代碼,指定語言包的路徑。

Node

const path = require('path');
 
const worker = createWorker({
  langPath: path.join(__dirname, '..', 'lang-data'), 
  logger: m => console.log(m),
});
 
(async () => {
  await worker.load();
  await worker.loadLanguage('eng');
  await worker.initialize('eng');
  const { data: { text } } = await worker.recognize('image-path'));
  console.log(text);
  await worker.terminate();
})();

Web

<script src="../node_modules/tesseract.js/dist/tesseract.min.js"></script>
<script>
  const { createWorker } = Tesseract;
  const worker = createWorker({
    workerPath: '../node_modules/tesseract.js/dist/worker.min.js',
    langPath: '../lang-data',
    corePath: '../node_modules/tesseract.js-core/tesseract-core.wasm.js',
    logger: m => console.log(m),
  });
 
  (async () => {
    await worker.load();
    await worker.loadLanguage('eng');
    await worker.initialize('eng');
    const { data: { text } } = await worker.recognize('image-path');
    console.log(text);
    await worker.terminate();
  })();
</script>

這是我的測試圖片

在這裏插入圖片描述
現在設置好文件名,然後運行程序,會得到這樣的結果:

(IMTANMUEARRMAD
3 1383 09602 2010

顯然,下面的數字是我想要的。如果希望結果只有數字,可以設置一個字符白名單:

await worker.setParameters({
    tessedit_char_whitelist: '0123456789',
  });

重新運行下,結果有些不一樣了:

101011191 1 1 1111  111  11 1   41 111  1  11  11 111 11 1 11
31383096022010

我不清楚上面這一竄的數字是怎麼回事,猜想可能和語言包有關。打開語言包的倉庫https://github.com/naptha/tessdata。下載一個最佳訓練集的eng.traineddata.gz試試。再運行程序,發現結果正常了:

31383096022010

這個實驗發現,Tesseract.js在做純文字識別的時候,效果挺好的。但是條形碼的圖,在識別的時候效率比較低,會把條形碼當成文字來識別。

源碼

https://github.com/yushulx/javascript-barcode-ocr

發佈了44 篇原創文章 · 獲贊 43 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章