uni*_*n80 36 opencv tesseract image-processing objective-c ios
我正在开发一款可以识别车牌(ANPR)的应用程序.第一步是从图像中提取牌照.我正在使用OpenCV来检测基于宽高比的印版,这非常有效:


但正如您所看到的,OCR结果非常糟糕.
我tesseract在我的Objective C(iOS)环境中使用.这些是init启动引擎时的变量:
// init the tesseract engine.
tesseract = new tesseract::TessBaseAPI();
int initRet=tesseract->Init([dataPath cStringUsingEncoding:NSUTF8StringEncoding], [language UTF8String]);
tesseract->SetVariable("tessedit_char_whitelist", "BCDFGHJKLMNPQRSTVWXYZ0123456789-");
tesseract->SetVariable("language_model_penalty_non_freq_dict_word", "1");
tesseract->SetVariable("language_model_penalty_non_dict_word ", "1");
tesseract->SetVariable("load_system_dawg", "0");
Run Code Online (Sandbox Code Playgroud)
如何改善结果?我是否需要让OpenCV进行更多的图像处理?或者有什么我可以用tesseract改进?
Ale*_*x I 50
有两件事可以完全解决这个问题
从图像中删除不是文本的所有内容.您需要使用一些CV来查找板区域(例如通过颜色等),然后屏蔽掉所有背景.您希望tesseract的输入为黑色和白色,其中文本为黑色,其他所有内容均为白色
消除偏斜(如上面的FrankPI所述).tesseract实际上应该可以正常工作(参见R. Smith的" Tesseract OCR Engine "概述),但另一方面它并不总是有效,特别是如果你有一行而不是几段.因此,如果您可以可靠地执行此操作,首先手动删除倾斜总是好的.你可能会知道步骤1中板块的边界梯形的确切形状,所以这不应该太难.在删除歪斜的过程中,您还可以删除透视:所有牌照(通常)都具有相同的字体,如果您将它们缩放到相同(无透视)的形状,字母形状将完全相同,这将有助于文字识别.
一些进一步的指示......
首先不要尝试编写代码:从一个非常容易的OCR(即:直接在前面,没有透视图)板的图片,在photoshop(或gimp)中编辑它并通过命令行上的tesseract运行它.以不同的方式继续编辑,直到这样做.例如:按颜色选择(或选择字母形状的洪水),填充黑色,反转选择,填充白色,透视变换,因此板的角是矩形等.拍摄一堆图片,一些更难(可能来自奇数角度等).与所有人一起做这件事.一旦完成,请考虑如何制作一个与您在photoshop中做同样事情的CV算法:)
PS此外,如果可能,最好从更高分辨率的图像开始.看起来您的示例中的文本大约14像素高.tesseract与300 dpi的12点文本相当不错,大约50像素高,在600 dpi时效果更好.尽量让你的信件大小至少为50,最好是100像素.
PPS你在做什么训练tesseract?我认为你必须这样做,这里的字体不同就足以成为一个问题.你可能还需要一些东西来识别(而不是惩罚)破折号,这些破折号在你的文本中很常见,看起来在第二个例子中"T-"被认为是H.
gun*_*yim 13
我不太了解tesseract,但我有一些关于OCR的信息.开始了.
希望这可以帮助.