我正在尝试使用Tesseract的OCR从法国重要卡中读取NIRPP号码(社会安全号码)(我正在使用TesseractOCRiOS
4.0.0)。所以这就是我在做什么:
首先,我要求提供一张整张卡片的照片:
然后,我使用自定义裁剪器,要求用户专门放大卡号:
然后我捕获到此图像( 1291 x 202 px),然后使用Tesseract尝试读取数字:
let tesseract = G8Tesseract(language: "eng")
tesseract?.image = pickedImage
tesseract?.recognize()
print("\(tesseract?.recognizedText ?? "")")
但是我得到的结果非常糟糕……仅在30%的时间内Tesseract能够找到正确的数字,在这些情况下,有时我需要修剪一些字符(例如字母,点,破折号。) )。
那么我有解决方案来改善这些结果吗?
感谢您的帮助。
答案 0 :(得分:0)
要改善您的结果:
如果提取的文本与正则表达式匹配,则应配置 tesseract也要使用该正则表达式。
预处理图像以去除背景色并应用 诸如腐蚀之类的形态效应会增加您之间的空间 字符/数字。如果它们太近,则tesseract将具有 很难正确识别它们。大部分图像处理 库带有这些效果。
一旦您拥有针对tesseract的正确的预处理管道和配置,通常将获得非常好的且一致的结果。
答案 1 :(得分:0)
您需要做几件事。...
1。您需要在图像上应用黑白或灰度。 您将使用默认功能(例如图形框架)或第三方库(例如openCV或GPUImage)来应用黑白或灰度。
2。然后使用Vision框架应用文本检测。 通过视觉文本检测,您可以根据视觉文本检测到的坐标裁剪文本。 3.将此裁剪后的图像(检测到文本)传递到TesseractOCRiOS ...
我希望它适用于您的用例。
谢谢
答案 2 :(得分:0)
我有一个类似的问题。我发现Tesseract仅在给定图像包含感兴趣区域的情况下才能识别文本。
我使用Apple' Vision framework解决了问题。它具有VNDetectTextRectanglesRequest
,可根据图像返回CGRect
的检测到的文本。然后,您可以将图像裁剪到存在文本的区域,然后将其发送到Tesseract进行检测。
由于HP具有独立开发的产品使用的页面布局分析技术,因此Tesseract从未需要自己的页面布局分析。因此,Tesseract假定其输入是已定义可选多边形文本区域的二进制图像。