在做条形码识别的时候,有可能碰到条形码因为被破坏,无法识别的情况。通常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在做纯文字识别的时候,效果挺好的。但是条形码的图,在识别的时候效率比较低,会把条形码当成文字来识别。