【发布时间】: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++ 调用上设置断点也可能为您指明正确的方向。您可以检查两个平台之间传递的原始数据是否相同。如果您在两个平台上使用相同的图像,则区分此函数调用可以为您指出答案。对不起,我无法提供更多帮助,祝你好运。如果你找到答案不要忘记发布它,我真的很想知道这里发生了什么:)
标签: android ios ocr tesseract tess-two