Android 中的 Tesseract 字符识别问题(但 iOS 上没有?)
Posted
技术标签:
【中文标题】Android 中的 Tesseract 字符识别问题(但 iOS 上没有?)【英文标题】:Tesseract character recognition problems in Android (but not on iOS?) 【发布时间】:2015-08-12 12:44:48 【问题描述】:我已经构建了一个应用程序,它使用 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 不断地错误识别某些字符(Ss 为 6s,Hs 为 6s)。
在两个平台上,我使用相同的白名单字符串,禁用 load_type_dawg 和 load_system_dawg,并选择保存 blob 选项。
有没有人遇到过这种情况?我是否缺少在 iOS 中自动处理的 Android 设置? Android 有什么特别的地方没有让我想到吗?
任何想法或建议将不胜感激!
【问题讨论】:
您是否尝试过消除来自设备摄像头的不确定性?如果您为尝试进行 OCR 的内容拍摄静态照片,并将该静态照片提供给两个平台上的第 2 步(openCV),您仍然会发现差异吗?我试图了解问题是来自 Tesseract 还是来自堆栈中的更高级别。 嗨罗宾!刚刚测试了这个理论。从 iOS 获取二值化图像并将其用作 Android 上的输入(绕过 OpenCV 并直接进入 Tesseract),有趣的是,它无法识别图像。然而,在 iOS 上确实如此。 是无法识别格式,还是实际 OCR 有问题?此外,您是否在 iOS 和 Android 的 tesseract 周围使用了包装器(您提到 tess-two 是为了“灵感”,但您实际上是在自己做 tesseract 的包装吗? Android 上的实际 OCR 出现问题。是的,我在 iOS 和 Android 上都使用了包装器。特别是在 Android 上,我使用 Tess-Two 作为起点并偏离它以适应我们的一些需求。 使用 ndk_gdb 在对 Tesseract 的 C++ 调用上设置断点也可能为您指明正确的方向。您可以检查两个平台之间传递的原始数据是否相同。如果您在两个平台上使用相同的图像,则区分此函数调用可以为您指出答案。对不起,我无法提供更多帮助,祝你好运。如果你找到答案不要忘记发布它,我真的很想知道这里发生了什么:) 【参考方案1】:所以,经过大量工作后,我发现了我的 Android 应用程序出了什么问题(谢天谢地,这根本不是 Tesseract 的问题)。由于我比 Android 更熟悉 iOS 应用程序,因此我不确定如何在不要求用户将文件加载到其外部存储设备上的情况下将训练数据文件加载到应用程序中。我在这个项目 (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 中的 Tesseract 字符识别问题(但 iOS 上没有?)的主要内容,如果未能解决你的问题,请参考以下文章