首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tesseract识别车牌

使用tesseract识别车牌
EN

Stack Overflow用户
提问于 2013-10-09 17:51:57
回答 5查看 53.5K关注 0票数 37

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

但如你所见,OCR结果相当糟糕。

我在我的Objective C (iOS)环境中使用tesseract。以下是我在启动引擎时的init变量:

代码语言:javascript
复制
// 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改进的吗?

EN

回答 5

Stack Overflow用户

发布于 2013-10-17 12:31:02

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

  1. 将从图像中删除除文本以外的所有内容。你需要使用一些CV来找到车牌区域(例如通过颜色等),然后遮罩掉所有的背景。你想要输入到

tesseract是黑白的,文本是黑色的,其他的都是白色的,删除

  1. FrankPI (正如上面提到的)。tesseract实际上应该可以与skew一起工作(参见R. Smith的"Tesseract OCR Engine“概述),但另一方面它是doesn't always work,特别是如果你只有一行,而不是几个段落。因此,如果您可以可靠地执行此操作,那么首先手动消除偏差总是很好的。您可能会在步骤1中知道板的边界梯形的确切形状,因此这应该不会太难。在消除倾斜的过程中,您还可以删除透视:所有车牌(通常)都具有相同的字体,如果您将它们缩放为相同的(无透视的)形状,字母形状将完全相同,这将有助于文本识别。

还有更多的建议。

不要试图在一开始编写代码:获取一个真正容易的OCR (即:从正前方,没有透视)的盘子图片,在photoshop (或gimp)中编辑它,并在命令行上通过tesseract运行它。继续以不同的方式编辑,直到它起作用。例如:按颜色选择(或泛洪选择字母形状),用黑色填充,反转选择,用白色填充,透视变换让盘子的角落是一个矩形,等等。对所有人都这样做。一旦它完全起作用了,想一想如何制作一个CV算法,它可以做你在photoshop中做过的事情:)

另外,如果可能的话,最好从更高分辨率的图像开始。看起来你的例子中的文本大约有14个像素高。tesseract在300dpi的12点文本上工作得很好,这大约是50像素高,在600dpi下工作得更好。尽量使你的字母大小至少为50,最好是100像素。

另外,你对train tesseract做了什么吗?我认为你必须这样做,这里的字体有足够的不同,这是一个问题。您可能还需要一些东西来识别(而不是惩罚)破折号,这在您的文本中将非常常见,如在第二个示例中,"T-“被识别为H。

票数 56
EN

Stack Overflow用户

发布于 2013-10-09 20:08:10

我不太了解tesseract,但我有一些关于OCR的信息。我们开始吧。

  • 在光学字符识别任务中,您需要确保训练数据的字体与您尝试识别的字体相同。或者,如果你正在尝试识别多种字体,请确保你的训练数据中有这些字体,以获得最佳的performance.
  • As据我所知,tesseract以几种不同的方式应用光学字符识别:首先,你给出一幅包含多个字母的图像,并让tesseract进行分割。另一种情况是,你给了tesseract分段的字母,只希望它能识别这个字母。也许你可以尝试改变你正在使用的识别器。
  • 如果你自己训练识别器,请确保你的训练数据中有足够和相等数量的每个字母。

希望这能有所帮助。

票数 13
EN

Stack Overflow用户

发布于 2013-10-23 02:40:46

我一直在开发一个iOS应用程序,如果你需要提高结果,你应该训练tesseract OCR,这对我来说提高了90%。在转换之前,OCR结果相当糟糕。

因此,我在过去使用这个gist来训练带有车牌字体的tesseract ORC。

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19268648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档