在做條形碼識別的時候,有可能碰到條形碼因爲被破壞,無法識別的情況。通常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在做純文字識別的時候,效果挺好的。但是條形碼的圖,在識別的時候效率比較低,會把條形碼當成文字來識別。