我正在开发一个可以识别车牌(ANPR)的应用程序。第一步是从图像中提取车牌。我正在使用OpenCV根据宽/高比来检测车牌,这个方法效果很好:


但如你所见,OCR结果相当糟糕。
我在我的Objective C (iOS)环境中使用tesseract。以下是我在启动引擎时的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");我怎样才能提高结果?我需要让OpenCV做更多的图像操作吗?或者有什么我可以用tesseract改进的吗?
发布于 2013-10-17 12:31:02
有两件事可以完全解决这个问题:
tesseract是黑白的,文本是黑色的,其他的都是白色的,删除
还有更多的建议。
不要试图在一开始编写代码:获取一个真正容易的OCR (即:从正前方,没有透视)的盘子图片,在photoshop (或gimp)中编辑它,并在命令行上通过tesseract运行它。继续以不同的方式编辑,直到它起作用。例如:按颜色选择(或泛洪选择字母形状),用黑色填充,反转选择,用白色填充,透视变换让盘子的角落是一个矩形,等等。对所有人都这样做。一旦它完全起作用了,想一想如何制作一个CV算法,它可以做你在photoshop中做过的事情:)
另外,如果可能的话,最好从更高分辨率的图像开始。看起来你的例子中的文本大约有14个像素高。tesseract在300dpi的12点文本上工作得很好,这大约是50像素高,在600dpi下工作得更好。尽量使你的字母大小至少为50,最好是100像素。
另外,你对train tesseract做了什么吗?我认为你必须这样做,这里的字体有足够的不同,这是一个问题。您可能还需要一些东西来识别(而不是惩罚)破折号,这在您的文本中将非常常见,如在第二个示例中,"T-“被识别为H。
发布于 2013-10-09 20:08:10
我不太了解tesseract,但我有一些关于OCR的信息。我们开始吧。
希望这能有所帮助。
https://stackoverflow.com/questions/19268648
复制相似问题