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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章