使用tesseract识别车牌

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

有两件事可以完全解决这个问题

  1. 从图像中删除不是文本的所有内容.您需要使用一些CV来查找板区域(例如通过颜色等),然后屏蔽掉所有背景.您希望tesseract的输入为黑色和白色,其中文本为黑色,其他所有内容均为白色

  2. 消除偏斜(如上面的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的信息.开始了.

  • 在OCR任务中,您需要确保您的列车数据与您尝试识别的字体相同.或者,如果您尝试识别多种字体,请确保您的列车数据中包含这些字体以获得最佳性能.
  • 据我所知,tesseract以几种不同的方式应用OCR:一,你给出一个包含多个字母的图像,让tesseract进行分割.另外,你给tesseract分段的字母,只希望它能识别这封信.也许你可以尝试改变你正在使用的那个.
  • 如果您正在训练识别器,请确保您的列车数据中每个字母都有足够的数量.

希望这可以帮助.


chr*_*man 9

我一直在研究iOS应用程序,如果你需要改进你应该训练tesseract OCR的结果,这对我来说提高了90%.在转换之前,OCR结果非常糟糕.

所以,我过去用这个要点来训练带有车牌字体的tesseract ORC.

如果你有兴趣,我几周前在github上开源了这个项目