Tesseract识别含条形码图像时无法正确读取数字问题咨询
问题场景
目标是从同时包含条形码、条形码下方对应数字的图像中读取数字内容,实际测试表现如下:
- 单独裁剪出数字区域做识别时,运行如下代码可准确返回对应数字文本:
tesseract.doOCR(new File("C:\\XXXXX\\teess.jpg")); - 实际使用场景中无法单独传入仅含数字的图像,输入始终是附带条形码的完整区域:该区域本身是主图像通过
subimage()方法截取的子图,若进一步做精准裁剪定位数字区域实现难度较高,还存在字符遗漏的风险。 - 直接传入包含条形码的完整图像做识别时,程序始终返回随机乱码字符,无法得到目标数字,识别结果如下:
Text is ::Sample # 38
“'!'JJ'J'L'1'L!“L"‘|
输入图像为条形码附带下方对应真实数值的样式,示例如下:
运行日志中出现两条警告信息:
Warning: Parameter not found: enable_new_segsearch
Warning: Invalid resolution 0 dpi. Using 70 instead.
可落地解决思路
- 先解决日志里的DPI异常问题:子图通过
subimage()截取时不会携带原图像的DPI元数据,直接传给Tesseract就会触发0 DPI警告,引擎自动用70DPI做识别会大幅降低准确率,识别前手动给子图设置300DPI即可。 - 不需要做精准数字区域裁剪,直接做粗范围截取即可:条形码固定在子图上半区域,数字固定在条形码正下方,直接截取子图纵向位置从总高度2/3处到底部的区域送入OCR,既不会裁到数字导致遗漏,也能完全避开上半部分条形码的干扰,实现成本极低。
- 调整Tesseract识别参数:
- 设置页面分割模式为
6(视为单一统一文本块),避免默认模式下把条形码的条空纹理误判为零散字符 - 设置字符白名单为
0123456789,仅允许引擎输出数字,从根源上过滤乱码符号
- 设置页面分割模式为
- 简单图像预处理:识别前把截取到的下半部分图像做灰度化、自适应二值化处理,强化数字和背景的对比度,进一步提升识别准确率。
- 若当前使用的Tesseract版本低于5.0,直接升级到最新稳定版,即可解决
enable_new_segsearch参数不存在的警告,新版本的文本分割逻辑对印刷数字的识别准确率更高。
内容的提问来源于stack exchange,提问作者aarav
相关产品推荐
相关产品推荐

