我构建了一个应用程序,它使用 Tesseract (V3.03 rc1) 来识别一些特定的文本字符串。不幸的是,这些打印在自定义字体上,需要我构建自己的训练数据文件。我在 iOS(使用 https://github.com/gali8/Tesseract-OCR-iOS 作为灵感)和 Android(也使用 https://github.com/rmtheis/tess-two/ 作为灵感)上构建了应用程序。
两个平台的工作流程如下:
我在预览屏幕上选择了一个边界框,我可以在其中裁剪相关文本,并相应地裁剪图像。
我使用 OpenCV 获取二值图像(使用 OpenCV 的自适应阈值函数,两个平台的参数相同)
我将此二进制图像传递给 Tesseract。两个平台(Android 和 iOS)都使用相同的训练数据文件。
然而,iOS 可以完美地识别文本字符串,而 Android 总是错误识别某些字符(6s 代表 Ss,As 代表 Hs)。
在两个平台上,我使用相同的白名单字符串,禁用 load_type_dawg 和 load_system_dawg,并选择保存 blob 选择。
有没有人遇到过这种情况?我是否缺少在 iOS 中自动处理的 Android 设置? Android 有什么我没有想到的特别之处吗?
如有任何想法或建议,我们将不胜感激!
最佳答案
因此,经过大量工作后,我发现了我的 Android 应用程序出了什么问题(谢天谢地,这根本不是 Tesseract 的问题)。由于我对 iOS 应用程序比 Android 应用程序更熟悉,所以我不确定如何在不要求用户将文件加载到他们的外部存储设备上的情况下将经过训练的数据文件加载到应用程序中。我在这个项目 ( http://www.codeproject.com/Tips/840623/Android-Character-Recognition ) 中找到了灵感,因为它们会自动加载经过训练的数据文件。
但是,我误解了它的工作原理。我最初认为 TessDataManager 对项目的本地 tesseract/tessdata 文件夹进行了文件查找,以获取经过训练的数据文件(我也在 iOS 上这样做)。但是,这不是它的作用。相反,它会检查内部文件结构 (data/data/projectname/files/tesseract/tessdata/traineddatafilegoeshere) 以查看文件是否存在,如果不存在,它会复制保存在 Resources/中的训练数据文件原始目录。在我的例子中,它默认为 eng 文件,所以它从不读取我的自定义字体文件。
希望这可以帮助遇到类似问题的其他人。感谢 Robin 和 RmTheis 的帮助!
关于android - Android 中的 Tesseract 字符识别问题(但 iOS 上没有?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30533153/