Tesseract4.0 APIExamples 验证实录与函数解析

       本文主要记录Tesseract4.0 APIExamples中的Result iterator example,Example of iterator over the classifier choices for a single symbol,Example to get confidence for alternative symbol choices per character for LSTM这三个示例的运行结果和相关函数的解析。测试均在Tessrect4.0+VS2017+Win10的条件下进行,如果对于安装有疑问,请参考这里:Tesseract4.0+VS2017+win10源码编译攻略

       1. 前言

       想让Tesseract在应用程序中发挥更好的性能,那就要遵守一些基本的使用规则,我认为最基本的规则是“白纸黑字”和“阅后即焚”。

       白纸黑字

       在Tesseract Github的wiki中,建议4.X以上的版本待识别图像为“白纸黑字”的风格,这一项在其ImproveQuality的有明确说明。

       While tesseract version 3.05 (and older) handle inverted image (dark background and light text) without problem, for 4.x version use dark text on light background.

       阅后即焚

       Tesseract的绝大多数常用API都要求使用完成后,删除相应指针。在APIExamples的源码中可以看到这一点,另外在tesseract/src/api/baseapi.cpp的函数注释中大量出现了类似语句。

       The returned iterator must be deleted after use.

       例如,我们常用的用于接收GetUTF8Text识别结果的指针,也是需要清理的,针对这个问题,Tesseract的tesseract/unittest/baseapi_test.cc中有一个很好的范例,值得借鉴。

      2 APIExamples验证结果

      为了方便对比,本文验证的三个示例均使用同一个测试图片,源代码中命名为【phototest.tif】的图片,如下所示:

the test image in Tesseract API Example

 【1】Result iterator example输出了识别结果中的单词,当前单词可信度[0最低,100最高],单词所在的外接矩形坐标。

Result iterator example


【2】Example of iterator over the classifier choices for a single symbol,该示例设置识别区域是图片中的第5行文字,输出每个字符的识别结果以及当前字符的可信度。

the classifier choices for a single symbol

【3】Example to get confidence for alternative symbol choices per character for LSTM,该示例输出了Tesseract认为可能的字符,该字符在单词中的排序,相应值的可信度,当前字符所在的外接矩形。

下面截图的是“the lazy”的识别结果。Tesseract识别出的”t”是单词”the”的第一个字符,99%可能是”t”,0%是”h”。而单词”lazy”的第一个字母”l”,Tesseract认为它95%可能是”l”,2%可能是”a”,%1可能是I,%0可能是”j”。

per character for LSTM

3.APIExamples源码分析

【1】Result iterator example


【2】Example of iterator over the classifier choices for a single symbol

【3】Example to get confidence for alternative symbol choices per character for LSTM

观察上述三个范例的源码,我们可以发现它们的初始化部分以及整体功能架构是非常相似的,基本顺序为:读取输入图像–>初始化tesseract–>SetImage–>Recognize–>然后从ResultIterator和PageIteratorLevel获取不同的数据并输出。

第【2】个例子中有调用SetRectangle,该函数可以让Tesseract识别指定矩形区;第【2】【3】个例子中均调用了SetVariable,但它们设定了不同的参数。

首先我们来看一下PageIteratorLevel和ResultIterator

PageIteratorLevel是一个枚举变量类型,它的定义函数路径为tesseract/include/tesseract/publictypes.h。

ResultIterator则是一个单独用于存储Tessereact识别结果的类,在调用ResultIterator之前,需要已正确初始化tesseract,并且已对图片执行过识别,图片识别可以由recognition/GetUTF8Text/TesseractRect等等函数来实现该类有各种函数可以获取到Tesseract的识别结果,含字符,字符位置,单词,单词位置,字符与单词可信度等等具体功能可以查阅其头文件,头文件路径为include/tesseract/resultiterator.h

这样我们就可以理解了,Tesseract识别完成后,会将相关的识别结果存放在ResultIterator中,通过PageIteratorLevel可以设定当前获取的识别结果信息类型,可以设定行,段,单词,字符等为单位。通过设定合适的变量,即可从ResultIterator取用需要的值。

例【2】和例【3】中用到的SetVariable是一个神通广大的函数,在src/ccmain/tesseractclass.h中有其部分可设定变量以及含义解释,但是在APIExamples中出现过的”save_blob_choices”和”lstm_choice_mode”并未在该文件中找到,而且可惜的是在Tesseract的Wiki中找不到其完整的可设定变量及相关意义,有知道完整定义的同学还请不吝赐教。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub