我该如何选择 Tesseract 和 OpenCV?

100
我最近发现了TesseractOpenCV。看起来Tesseract是一个完整的OCR引擎,而OpenCV可以用作创建OCR应用/服务的框架。
我尝试在我的一些图像上使用Tesseract,它的准确性似乎还不错。后来,我发现了一个非常简单的教程,介绍如何使用Python使用OpenCV进行OCR,并且感到印象深刻。在短短几分钟内,我完成了系统的训练,其准确性也很好。但是,采用这种方法意味着我需要使用大量的训练集对系统进行广泛的训练。
我的具体问题如下:
  • 如何在Tesseract和使用OpenCV构建自定义OCR应用之间进行选择?
  • Tesseract有针对不同语言的训练数据集可用。OpenCV是否有类似的东西,以便我不必从头开始实现OCR?
  • 哪个更适合想要成为商业应用程序的人?

有什么建议吗?


10
下面的回答真的很好,但作为一名曾经使用OCR工作的人,我可以告诉你,在商业应用用户的期望下,Tesseract的识别质量还不够。Tesseract很好,但OCR很难——像在线培训或即时改进这样的事情仍然需要研究。Google是TS背后的大赞助商,它决定建立自己的引擎——OCROpus。虽然它承诺将其开源,但核心识别引擎尚未公开——他们只发布了一个框架——那是对Tesseract的API。 - Sam
3
@vasile: 这非常有启发性,我之前不知道OCROpus。谢谢你。如果我的最终目标是编写商务卡片OCR(或者读取加油站收据的OCR,例如我提供的这个链接:http://upload.wikimedia.org/wikipedia/en/3/34/Shell-Gas-Station-Receipt-MasterCard.jpg),您是否有任何替代建议?我问这个问题只是出于好奇,想了解众多移动应用程序使用的方法。我不介意在服务器端进行OCR处理。我看到这个酷炫的演示后也想尝试使用OpenCV:http://www.youtube.com/watch?v=OkcOfS1lTxs - Legend
6
有许多商业OCR引擎,只需在谷歌上搜索“OCR准确性测试”,你就会找到一些图表。关于手机应用程序,大多数使用Tesseract。但是如果你下载其中一些应用程序,你会发现结果与承诺有些不同。它们通常会在精心控制的环境中制作视频演示,并发布在YouTube上,但在实际使用中,如果你扫描页面/菜谱/卡片等,你将得到一些有趣的结果。 - Sam
1
@vasile:谢谢你。今晚有事情可以让我忙碌了。非常感谢你的时间。 - Legend
4个回答

84
  • Tesseract 是一款OCR引擎。它由Google开发、维护并提供资金支持,专门用来从图像中读取文字,进行基本的文档分割以及处理特定的图像输入(单个单词、行、段落、页面、有限的字典等)。

  • 另一方面,OpenCV 是一个计算机视觉库,包括可以执行某些特征提取和数据分类的功能。你可以创建一个简单的字母分割器和分类器,执行基本的OCR,但它并不是一个非常优秀的OCR引擎(我以前用Python从零开始制作过一个。对于偏离训练数据的输入,它非常不准确)。

如果您想了解OCR有多难,请尝试使用OpenCV。Tesseract才是真正的OCR引擎。


3
这取决于您的输入图像。当字母清晰、水平排列、间隔适当、不相连且纯黑白时,Tesseract效果最好。我曾在DIY图书扫描/保存社区中摸索了一年,并在空闲时间里开发软件来简化这个过程。目前市面上处理任何带有文本图像的最佳软件(无论商业还是非商业)是Scan Tailor。它有一些CLI选项,但如果您花些时间了解其工作原理,它会让你惊奇不已。 - Blender
2
我曾经花了一点时间在Scan Tailor的源代码上工作,它内部并没有使用OpenCV,但是许多被创建的算法可以很容易地用OpenCV的函数重写。如果您的图像没有扭曲和退化,那么您只需要在将图像输入Tesseract之前实现自适应二值化和一些简单的去斑点处理即可。 - Blender
1
关于你的问题,昨天我只是在测试一些随机输入图像。我尝试了一个加油站的收据:http://upload.wikimedia.org/wikipedia/en/3/34/Shell-Gas-Station-Receipt-MasterCard.jpg 它将0识别为8(在$20.00的总额中)。我承认这个数字对我来说也很难辨认,但我不确定还能做什么来适应Tesseract这种情况,或者是否需要引入学习组件,如果我将拥有一个活跃的用户群。 - Legend
5
Tesseract是针对特定字体集训练的。那些方块字不在其中。你需要献祭动物并尝试自己训练Tesseract:http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3 - Blender
1
@valentt:Scan Tailor的开发在将近两年前就停止了,所以它实际上是一个已经死亡的项目。很遗憾没有其他替代方案。 - Blender
显示剩余10条评论

67

我是您提到的数字识别教程的作者,我想说,那绝对无法替代Tesseract。

Tesseract是一个非常好的OCR引擎,可能是最好的开源OCR引擎。

您提到的教程只是为了理解OCR的最简单工作原理而尝试。

因此,如果您正在寻找OCR应用程序,我建议您使用OpenCV预处理图像,然后应用Tesseract引擎。


2
+1 谢谢。首先,感谢您的教程 :) 它是一篇非常有趣的阅读。您是否知道有关如何将OpenCV与Tesseract结合使用的任何参考/教程?我不是在谈论接口,而是需要进行哪种类型的图像转换或预处理以提高Tesseract的准确性? - Legend
2
只是想说一下,虽然与其他OCR引擎相比,Tesseract是一个不错的选择,但它仍然相对不够准确。我在识别正确文本方面的成功率大约只有40%。希望未来几年会有所改善。 - GangstaGraham
4
你只需要训练Tesseract,就可以在几小时或几天内获得更好的结果,而不是需要多年的时间。以下是需要翻译的网址:http://opensource.newmediaist.com/tesseract-training.html - valentt
1
我使用PyTesseract进行实时文本提取。在Linux PC上它运行良好,但在树莓派环境下非常缓慢...有没有安装轻量级版本的方法?例如,只处理英文字母的数字和大写字母? - Yuriy Chernyshov

10
两者可以相辅相成。如果你阅读OpenCV的论文:https://github.com/tesseract-ocr/docs/blob/master/tesseracticdar2007.pdf,会发现它指出:“由于惠普公司已经独立开发了页面布局分析技术并将其用于产品中(因此不会公开源),Tesseract从未需要自己的页面布局分析技术。因此,Tesseract假设其输入是一个带有可选多边形文本区域定义的二进制图像。”
这种任务可以由OpenCV执行,并将结果图像传递给Tesseract。你可以在Git存储库中找到此类型代码的示例:https://github.com/Itseez/opencv_contrib/tree/master/modules/text/samples,这些示例使用Tesseract API进行图像到文本转换。

4

OpenCV是一个用于计算机视觉的库,通常用于分析和处理图像。Tesseract是一个用于OCR的库,它是CV的专业子集,专门用于从图像中提取文本。

来自OpenCV.org

.....用于检测和识别人脸,识别对象,在视频中分类人类行为,跟踪摄像机运动,跟踪移动对象,从立体相机中提取物体的三维模型,将图像拼接在一起以产生整个场景的高分辨率图像,从图像数据库中查找相似的图像,从使用闪光灯拍摄的图像中去除红眼,跟踪眼睛运动,识别风景并建立标记以与增强现实叠加等

来自Tesseract Github:

.....可以直接使用,或者(对于程序员)使用API从图像中提取打印、手写或印刷的文本。它支持各种语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接