【C++开发】Qt+Tesseract实现文字识别的各种坑(已解决)
最近在给之前Qt医疗管理系统项目添加一个文字识别功能,但是在其中遇到非常多坑,花费了我比较多的时间(查阅了很多文章),这篇文章主要用来整理这些坑(非常详细)。
Qt版本:Qt5.13
VS版本:VS2017
编译器(构建套件):Desktop Qt 5.13.0 MSVC2017 64bit
以上环境都必须保持一致,否则可能会出现意想不到的错误。
Tesseract库下载
我这里选择比较简单的获取库的方法,就是下载已经通过源码编译好的库,当然也可以在GitHub上找到Tesseract的开源项目下载源码自己编译。为什么不选择后者呢?容易出错!如果你是刚接触的小白,本人强烈推荐前者;如果你是大佬,那当我没说哈哈哈~
这个库我已经放到主页的资源下,需要的自取。下载之后解压缩看到以下3个文件夹就说明下载成功。
Qt版本选择
这里我Qt的版本选择的是Qt5.13,大家尽量保持一样,避免出现不必要的错误。
这是之前在官网下载的,但是最近去看好像没有这个版本可以下载了,如果在官网中没有找到这个版本可以通过下面微信名片添加我,找我发安装包。
安装步骤
(1)打开安装包,点击Next。
(2)登录自己的Qt账号,Next。(没有Qt账号的话注册一个即可)
(3)这里最好修改路径,放到D盘,毕竟Qt还是比较大的。然后Next。
(4)勾选以下选项,Next。
(5)Next后开始安装。
VS2017安装
实测VS2019和VS2022都运行不起来,只有VS2017,大家尽量选择VS2017安装,保持版本一致。最近在VS官网上好像也没有看到VS2017的安装包,有需要的可以到我的主页下的资源中选择下载。
(1)点击打开社区版的安装包。
(2)按照下面操作进行勾选。
(3)这里最好修改路径到D盘,毕竟VS也是比较大的。
至此,Tesseract、Qt以及VS2017都已经准备好了。
MSVC调试器安装
虽然我们在安装Qt的时候,有选择MSVC版本,但是这里只会显示MinGW(也就是windows模拟器版本),这时候我们就需要安装一个MSVC调试器。
可以在我的主页资源中找到这个工具下载。
(1)解压后点击安装包,这里路径可以修改成D盘,Next。
(2)选择No,Next。
(3)只需要勾选这个,Install。
构建套件的导入
(1)安装完之后,打开Qt就可以发现MSVC版本的编译器就会自动加载进去。
(2)此时只需要在构建套件中按照红色框中的选,Apply,OK即可。
这样,就成功地将各种环境配置好了。
文字识别功能的检测
(1)新建一个工程,在.pro文件中添加这四个语句,+=后的路径是刚才下载Tesseract库存放的路径,按照我写的这个定位即可。
INCLUDEPATH += D:\QtProject\tesseracte_lib\tesseract_x64-windows\include\tesseract
LIBS+= D:\QtProject\tesseracte_lib\tesseract_x64-windows\lib\tesseract41.lib
INCLUDEPATH += D:\QtProject\tesseracte_lib\leptonica_x64-windows\include\leptonica
LIBS+= D:\QtProject\tesseracte_lib\leptonica_x64-windows\lib\leptonica-1.78.0.lib
(2)导入头文件(最重要的是最下面的两个<tesseract/baseapi.h>
和<tesseract/strngs.h>
)。使用刚才下载的路径导入即可。
#include <QDebug>
#include <QFileDialog>
#include <QTextCodec>
#include <iostream>
#include <memory>
#include <allheaders.h>
#include <D:/QtProject/tesseracte_lib/tesseract_x64-windows/include/tesseract/baseapi.h> // tesseract提供的关于C++的接口
#include <D:/QtProject/tesseracte_lib/tesseract_x64-windows/include/tesseract/strngs.h>
(3)代码编写。简单实现一下文字识别功能,看看效果。
// Basic example
char *outText;
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
// Initialize tesseract-ocr with English, without specifying tessdata path
if (api->Init("D:/QtProject/tesseracte_lib/tessdata", "chi_sim"))
{
fprintf(stderr, "Could not initialize tesseract.\n");
exit(1);
}
QString filename = QFileDialog::getOpenFileName(nullptr, tr("文件上传"), "", "");
QTextCodec *code = QTextCodec::codecForName("GB2312");
std::string str = code->fromUnicode(filename).data();
// std::string str = path.toStdString();
const char* ch = str.c_str();
// Open input image with leptonica library
Pix *image = pixRead(ch); //absolute path of file
api->SetImage(image);
// Get OCR result
outText = api->GetUTF8Text();
ui->textEdit->setText(outText);
// Destroy used object and release memory
api->End();
delete [] outText;
pixDestroy(&image);
(4)要记得将图一路径下的全部文件复制到可执行程序.exe(图二)的同级目录下。
(5)运行。需要注意:这里必须使用release来运行。
这里看到,识别的效果还是挺好的!
按照这套流程安装操作下来(版本一致),很大概率都是没问题的(测试了几台机子了),如果还出现问题的话,可以私信或者在下方名片添加我讨论,也可以在评论区交流讨论。