pytesseract 中image_to_data的C++实现

GetTSVText是Tesseract提供的在C++中可以获取TSV格式输出的函数,但其返回结果是字符串。那么在C++中是否能实现类似pytesseract中image_to_data DICT输出的函数,可以便捷获取识别结果的各项信息呢?本文将分享如何用GetTSVText实现该功能。

GetTSVText in C++

环境

VS2019
Tesseract5.0
opencv4.3

image_to_data在C++中的实现思路

以下代码是image_to_data在pytesseract中的实现。

根据代码可知,在pytesseract中,先调用tesseract.exe获取待识别图片的tsv格式的输出,然后根据设定将输出转换为BYTES,DATAFRAM,DICT,或者STRING的形式。在pytesseract image_to_data检测并定位图片中的文字中介绍的是DICT的输出,这也是比较常用的输出格式。同时我们也要注意:Tesseract3.05以下的版本不支持TSV格式。

明确了image_to_data在pytesseract中的实现步骤后,我们也基本确定其功能在C++中的实现思路:
1. 获取待识别图片TSV格式的输出,要求Tesseract3.05及以上版本。查阅Tesseract的相关API后可知c++有GetTSVText()函数可以实现此功能。
2. 将TSV格式的输出转换为类似Output.DICT的格式输出。C++中,与Python中DICT形式与存取方法较为接近的变量是std::map,因此在C++中最终的输出将是std::map的形式。

image_to_data在C++中的实现代码详解

image_to_data在C++中的实现的完整代码已上传至Github,欢迎测评。这里我们主要讲解实现函数。

第1~3行包含必要的头文件。
第7行定义将tesseract的tsv格式输出转换为C++ map输出的函数。
该函数的输出格式为std::map,它有四个输入参数,意义分别如下:


第10行定义tesseract变量。
第11行定义存储转换结果的变量。
第13~17行,tesseract变量实例化,并根据设定加载语言文件,若加载失败将直接返回空的结果。
第22~25行,根据设定结果将输入图像进行放大。在Tesseract中,有时将识别图像放大会得到更好的识别效果,目前该参数仅支持放大。
第26行,为tesseract实例化变量设定待识别图像的参数。
第29行,调用GetTSVText(0)函数获取Tesseract根据内部数据结构制作TSV格式的字符串.函数GetTSVText()有一个参数,其名称为”page_number”。我将该参数的意义理解为Tesseract对图片识别过程中进行页面分割的序号,一般情况下,该参数值为0。
第32行,用函数splitString将Tesseract的识别结果进行分割,分割符为”/n”。
splitString可以根据设定分割字符对输入的字符串进行分割,返回变量形式为vector<string>,在Github上可以获取本文完整的代码。
第34行,获取识别结果按”/n”分割后的vector中元素数量。
第37行,为返回结果初始化tsv文件的单项名称。若使用Tesseract输出tsv格式的文件,该文件中会有tsv结果各类别的名称;但GetTSVText()函数的返回结果中仅有各类别的结果,因此这里我们根据.tsv格式中各类别的名称为C++的map输出初始化单项名称。

第46~61行,遍历第32行代码分割后的vector<string>结果,根据37行初始化的单项类别,分别取出相应的结果,存储在相应类别中。

测试图像以及变量内容大致如下图:

results structure in tsv2map

在确认当前工程可以正常调用Tesseract后,我们可以用以下代码在C++工程中获取并使用类似pytesseract中image_to_data DICT的输出结果。

本文到此结束,感谢阅读,欢迎关注。

发表评论

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

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

Fork me on GitHub