ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Qt+Tesseract在Windows 64位编译与调用实战指南

Qt+Tesseract在Windows 64位编译与调用实战指南 简介该编译包为Tesseract OCR引擎的Windows 64位预编译版本专为Qt开发环境准备面向需要在桌面应用中集成文字识别能力的C/Qt开发者。包内含916个文件其中546个头文件提供完整API接口72个DLL和50个LIB文件可用于运行时调用与链接CMake配置脚本便于在Qt项目中自动查找依赖另有训练数据、命令行示例及版权声明等压缩后约39.32MB。开发者无需从源码编译Tesseract及其依赖库直接将这些库和头文件集成到Qt工程即可调用tesseract API实现图片文字识别、多语言OCR等功能。该资源已有1124人学习下载特别适合使用Qt Creator配合MSVC或MinGW构建环境、需要快速完成OCR功能落地的中高级开发者能有效避免编译踩坑、节省环境配置时间。1. Qt Tesseract 的 Windows 64 位编译版本为什么我劝你别从源码硬编在 Windows 64 位下给 Qt 配一个能用的 Tesseract 编译版本是很多 OCR 桌面项目的第一道坎。标题里这串字实际在问三件事Tesseract 在 Windows x64 下怎么编出来、编出来的库怎么和 Qt 的 MSVC 套件对上、以及有没有现成的编译版本可以抄作业。我的建议很直接别从零开始手编 Tesseract 源码优先用 vcpkg 拉官方构建链再对齐 Qt 的编译器位宽和运行库版本半小时内能跑通从源码裸编的人大多栽在 Leptonica 依赖和 MSVC/MinGW ABI 不匹配上。这篇文章就是写给 Qt 桌面上做文档识别、票据提取、截图转文字的人目标是把你引到一条能复现、能排错、能发布的路。2. 编译前先选型MSVC 还是 MinGWTesseract 5 还是 4依赖怎么配2.1 编译器决定生态MSVC 2019/2022 x64 是 Qt Tesseract 的唯一省心答案先说结论在 Windows 64 位做 Qt Tesseract编译器基本锁死 MSVC具体用 VS2019 还是 VS2022取决于你手头的 Qt 套件。Qt 官方预编译包在 Windows 下分 msvc2019_64、msvc2022_64 和 mingw 三系。Tesseract 本身是纯 C 项目用 Visual Studio 编出来的 DLL导出符号和运行库依赖VCRUNTIME、MSVCP全部挂在 MSVC 侧MinGW 的链接器无法直接链接 MSVC 编译的 .lib / .dll反过来也一样。这是 Windows 上最典型的 ABI 问题编译期可能报一堆无法解析的外部符号或者运行期在 DLL 加载处崩溃而且报错信息往往不指向真正的元凶。所以拿到一个新的 OCR 项目我第一件事是确认 Qt 用的哪套编译器。最快的方法是在 Qt Creator 的“工具链”页面看或者直接命令行查# 在 Qt 的 MSVC 套件命令行里执行路径按你自己的 Qt 版本改 E:\Qt\5.15.2\msvc2019_64\bin\qmake.exe -query QT_VERSION E:\Qt\5.15.2\msvc2019_64\bin\qmake.exe -query QT_INSTALL_PREFIX第一行输出 Qt 版本号第二行输出套件根目录。看到 msvc2019_64 或 msvc2022_64后面 Tesseract 的编译参数就对应 VS2019 或 VS2022。如果你手头是 MinGW 套件的 Qt又想省事最可靠的做法是直接换一个 MSVC 套件的 Qt而不是去给 Tesseract 做 MinGW 移植。社区里确实有 MinGW 编译 Tesseract 的教程但要么是改 Leptonica 源码要么是绕官方构建链维护成本非常高。血泪经验不要把时间花在强行配平 MinGW 上Windows 桌面的 C 生态就是 MSVC 的地盘顺着生态走才不折腾。2.2 Leptonica、CMake、vcpkgTesseract 构建链上的四个关键依赖Tesseract 核心识别代码不算多但它的图像底层完全依赖 Leptonica。Leptonica 提供 Pix 内存结构、图像解码和形态学操作Tesseract 的 SetImage 接口直接吃 Leptonica 的 Pix 对象。而 Leptonica 自己又依赖 libpng、libjpeg、libtiff、zlib。这条依赖链如果要手动编译光对齐 CMake 参数和库输出路径就能耗掉一个下午而且很容易配出“能编过但链接失败”的半成品。vcpkg 的价值就在这儿它把整条链以源码包形式编译进同一个 triplet产出统一放在 installed/x64-windows 目录下头文件、导入库、运行 DLL 的路径完全可预期。下面这张表是构建链上的关键角色依赖作用缺了会怎样Leptonica图像解码、Pix 内存结构、预处理算法Tesseract 编译直接失败找不到 liblept 头文件libpng / libjpeg / libtiff常见图像格式编解码链接期报找不到 zlib/png/jpeg 符号zlib压缩基础库libpng/libjpeg 的依赖断裂链接失败CMakeTesseract 的构建系统无法生成 Visual Studio 工程编译参数上Tesseract 官方要求 CMake 3.16 以上VS 的 C 工具集必须勾选“使用 C 的桌面开发”工作负载包含 MSVC v142/v143 编译器和 Windows SDK。很多人漏掉的是 vcpkg 的 triplet 概念默认 triplet 可能是 x86-windows在 64 位机器上装出来的是 32 位库Qt 的 64 位程序链接时会报“无法解析的外部符号”或运行时崩溃。后面章节我会专门演示 triplet 的写法。2.3 预编译版本与自编译的取舍什么时候可以直接拿编译产物如果你的目标只是让 Qt 程序里能用 OCR并不打算改 Tesseract 内部算法那最划算的路线是直接用与 Qt MSVC 套件匹配的预编译产物。Tesseract 社区维护的 Windows 预编译包提供 x64 的 DLL、头文件和 tessdata 语言包解压就能用。这里的“编译版本”对多数人来说就是指这份现成的运行时而不是真的从源码编一遍。做项目选型时先想清楚你是要“一个能用的 Tesseract”还是“一个自己控制的 Tesseract”前者直接拿预编译后者才需要自编译。反过来如果你要裁剪 Tesseract 体积、修改识别引擎源码或者训练自己的模型那就必须自编译。自编译的产出是一个完整的 installed 目录include 头文件、lib 导入库、bin 运行 DLL以及可选的 tessdata。还有一点很多人不知道自编译时 MSVC 运行库版本要和 Qt 套件一致。Qt 5.15.2 的 msvc2019_64 套件默认配 VS2019 运行库你用 VS2022 编出来的 DLL 发布到没装 vc_redist 2022 的机器上会直接报缺少 MSVCP140.dll。这个坑发布到客户机器时才暴露属于没有后悔药的那种。预编译和自编译的分界就一句话只是调用拿预编译要改要裁走 vcpkg 自编译。3. 在 Windows 64 位下用 vcpkg 编译 Tesseract完整命令与 Qt 对接3.1 vcpkg 安装与 triplet 指定x64-windows 是最小可用配置vcpkg 是微软维护的 C 包管理器在 Windows 上装第三方库比手动 CMake 省事得多。先把 vcpkg 克隆并引导# 在你想放工具链的目录下执行 git clone https://github.com/microsoft/vcpkg cd vcpkg .\bootstrap-vcpkg.bat -disableMetrics $env:VCPKG_ROOT $PWD [Environment]::SetEnvironmentVariable(VCPKG_ROOT, $PWD, User)bootstrap-vcpkg.bat 会下载 vcpkg.exe 本体-disableMetrics 关掉统计上报。VCPKG_ROOT 建议设成用户级环境变量后续 CMake 的 toolchain 文件要用。PowerShell 里$env:VCPKG_ROOT只在当前窗口生效第二行 SetEnvironmentVariable 才会写进用户环境变量重开终端后依然有效。如果这一步失败最常见原因是网络请求 vcpkg 的下载地址超时重试通常能恢复频繁失败的话常见做法是给 vcpkg 配置开源镜像源把二进制下载指到国内高校镜像站速度会好很多。vcpkg 装好后安装 Tesseract 前必须显式指定 x64 triplet# 安装 Tesseract 的 64 位版本名称后面的 :x64-windows 不能省略 .\vcpkg install tesseract:x64-windows如果省略:x64-windowsvcpkg 会按默认 triplet 装默认值经常是 x86。Tesseract 在 x86 下也能编但和 Qt 的 64 位套件对接会引发位宽不匹配的连锁问题后面第 5 章专门讲。需要调试符号就装tesseract:x64-windows-debug但那会把依赖链全部编成 Debug 配置编译时间和磁盘占用翻倍常规调用完全没必要。装完可以执行.\vcpkg list看安装结果确认 tesseract 和 leptonica 都在列表里。3.2 编译 Tesseract 并导出头文件与 .lib/.dllvcpkg install 完成后所有产物都落在 installed/x64-windows 目录下。按默认配置vcpkg 只生成 Release 版本库。你需要的关键文件长这样installed\x64-windows\include\tesseract\baseapi.h # C API 头文件 installed\x64-windows\include\leptonica\allheaders.h # Leptonica 头文件 installed\x64-windows\lib\tesseract41.lib # 导入库版本号以实际为准 installed\x64-windows\bin\tesseract41.dll # 运行时 DLL要把这些文件带到 Qt 项目或发给同事推荐先用 vcpkg export 打包成独立目录# --raw 表示导出目录结构不解压成 zip .\vcpkg export tesseract:x64-windows --raw --output-dirD:\tesseract-x64导出目录下会按 include/lib/bin 重新组织比直接从 installed 里扒干净。导出后bin 目录里的 DLL 要全量拷贝到 Qt 程序的可执行文件目录。Tesseract 的 DLL 依赖 Leptonica 的 DLL通常是 liblept 打头的名称缺一个就在加载时报错而且报错往往指向“应用程序无法正常启动”。想确认依赖列表在 VS 开发人员命令行里跑dumpbin /dependents看导入表就能知道每个 DLL 到底缺谁。3.3 在 Qt 的 .pro / CMake 里链接 Tesseract三段可抄配置拿到产物后qmake 项目的 .pro 文件可以这么写# 把路径替换成你的导出目录 INCLUDEPATH D:/tesseract-x64/include DEPENDPATH D:/tesseract-x64/include LIBS -L$$quote(D:/tesseract-x64/lib) -ltesseract41-L指定库搜索目录-ltesseract41会去找 tesseract41.lib 或 tesseract41.dll。注意-L后的路径如果带空格qmake 会把路径拆成两个参数所以用$$quote()包起来。WIN32 下如果没有设置QMAKE_LFLAGSDebug/Release 配置可能分别去找带 d 后缀的调试库如果 vcpkg 只装了 Release 版要在 .pro 里把 Debug 配置的库指向同一个 lib或者直接CONFIG - debug_and_release。用 CMake 的项目推荐先试 vcpkg toolchain 的 find_package 方式set(CMAKE_TOOLCHAIN_FILE $ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake) find_package(Tesseract REQUIRED) target_link_libraries(my_ocr_app PRIVATE Tesseract::libtesseract)前提是你的 vcpkg 版本够新tesseract port 提供了 CMake config 文件。如果 find_package 失败不要硬磕直接手写 find_libraryfind_library(TESSERACT_LIB NAMES tesseract41 tesseract PATHS D:/tesseract-x64/lib) find_path(TESSERACT_INCLUDE_DIR NAMES tesseract/baseapi.h PATHS D:/tesseract-x64/include) target_link_libraries(my_ocr_app PRIVATE ${TESSERACT_LIB})参数含义很直白NAMES 用于兼容不同版本的导入库命名PATHS 指定搜索根目录。我一般优先用 find_library find_path 手写方案因为不依赖 vcpkg toolchain 是否配置成功Qt 老项目里排查依赖关系清楚得多。链接成功不代表运行没问题程序启动后 tesseract41.dll 和它依赖的 liblept DLL 必须和 exe 在同一目录或者在系统 PATH 里否则就是运行时加载崩溃。4. 从 Qt 调 Tesseract把 C API 包成可用的 OCR 类4.1 初始化 TessBaseAPI 与 SetImage别在 QImage 上直接传指针Tesseract 最常用的入口是 C 的 TessBaseAPI 类头文件是 tesseract/baseapi.h。初始化动作可以封装成一个函数#include tesseract/baseapi.h #include leptonica/allheaders.h tesseract::TessBaseAPI* initTesseract( const QString tessdataPath, const QString lang) { auto* api new tesseract::TessBaseAPI(); // Init 的第二个参数是 const char*中文路径要先转 UTF-8 if (api-Init(tessdataPath.toStdString().c_str(), lang.toStdString().c_str()) ! 0) { delete api; return nullptr; } api-SetVariable(save_blob_choices, T); return api; }Init 的第一个参数是 tessdata 父目录路径不是 traineddata 文件路径这是最常见的误解。比如 chi_sim.traineddata 放在 D:/tessdata 下第一参数就传 D:/tessdata语言名传 chi_sim传成 D:/tessdata/chi_sim.traineddata 会直接返回 -1。SetVariable 放在 Init 后、SetImage 前作用是保留字符选择的内部结果方便调试时看置信度对性能影响很小。图像传入是第二个高频翻车点。QImage 的内存布局不总是紧凑连续每行字节数 bytesPerLine 可能大于宽乘以通道数存在行对齐填充。直接把QImage::bits()当裸 buffer 传给 Tesseract图片会错位尤其是宽度不是 4 的倍数的图。正确做法是先转成标准格式再把 bytesPerLine 一起交给 SetImageQImage image original.convertToFormat(QImage::Format_RGB888); // SetImage 的原型像素指针、宽、高、每像素字节数、每行字节数 api-SetImage(image.bits(), image.width(), image.height(), 3, image.bytesPerLine()); char* utf8Text api-GetUTF8Text(); QString result QString::fromUtf8(utf8Text); delete[] utf8Text;这里 bytes_per_pixel 固定传 3因为 RGB888 是三通道。SetImage 不拷贝像素数据只是保存了指针所以 image 的生命周期必须覆盖整个识别过程。如果你在函数里传局部 QImage函数结束 image 析构后 Tesseract 还在读已失效的内存表现是随机崩溃而且特别难复现。识别完调用api-Clear()释放内部引用实例可以复用。4.2 中文与 UTF-8 编码QString 和 char* 之间的两次转换中文识别的坑基本集中在编码和语言包上。Tesseract 的简体中文语言包叫 chi_sim.traineddata体积较大必须单独下载放到 tessdata 目录。市面上很多“识别中文乱码”的报错八成是 Init 时语言名写成了 chn 或 zh_CNTesseract 只认 chi_sim / chi_tra 这种语言代码。识别结果从 GetUTF8Text() 返回的是 UTF-8 编码的 char*在 Qt 里必须用 QString::fromUtf8 转不能直接拿 char* 构造 QString否则中文字符会被按 Latin-1 解释直接变乱码。反过来设置白名单时 Tesseract 内部按 UTF-8 处理字符Windows 上 QString::toStdString() 恰好返回 UTF-8所以这条链路是安全的。真正隐蔽的坑是有人为了“兼容本地编码”用 toLocal8Bit()在中文 Windows 上会转成 GBKTesseract 把白名单当乱码解析识别质量立刻崩// 数字和英文场景白名单能显著降噪 api-SetVariable(tessedit_char_whitelist, 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ); // 白名单对中文基本无效中文推荐交给语言模型 api-SetVariable(tessedit_char_blacklist, |il1);SetVariable 必须放在 Init 之后、SetImage 之前调用。放在 SetImage 之后不会报错但完全不生效而且没有任何提示——这是 Tesseract 里最典型的静默失败。想验证变量是否生效可以调api-GetVariable(tessedit_char_whitelist, buf)看返回字符串。另一个细节中英文混排时语言参数传 chi_simeng两个包同时加载效果远好于只加载中文。4.3 同步识别还是异步QThread 里跑 OCR 的线程模型Tesseract 识别是 CPU 密集操作一张 1920x1080 的界面截图跑十几秒属于正常量级。直接在主线程调 GetUTF8Text界面会卡死鼠标转圈客户第一反应就是程序死掉了。常见做法是单独开一个 QThread用 moveToThread 把识别工作者丢进去信号槽传回结果class OcrWorker : public QObject { Q_OBJECT public slots: void doOcr(QImage img) { auto* api initTesseract(D:/tesseract-x64/tessdata, chi_simeng); // 4.1 里的 SetImage 和 GetUTF8Text 代码 QString text runOcr(api, img); emit ocrDone(text); } signals: void ocrDone(const QString); };关键点在于跨线程信号槽的连接类型。不同线程的 QObject 默认走队列连接信号参数会复制到接收线程的事件循环里所以 QString 在线程间传递是安全的。QImage 跨线程传递会拷贝引用计数而不是整份像素数据只要别在两个线程同时修改同一张图就没问题如果你要传多帧高清图建议先存成文件再传路径避免大内存块跨线程复制。启动线程的骨架用 moveToThread不要继承 QThreadauto* worker new OcrWorker; auto* thread new QThread; worker-moveToThread(thread); connect(thread, QThread::finished, worker, QObject::deleteLater); connect(this, MainWindow::needOcr, worker, OcrWorker::doOcr); connect(worker, OcrWorker::ocrDone, this, MainWindow::showResult); thread-start();这里把 worker 的所有权绑定到线程线程退出时自动销毁 worker避免出现“对象线程仍在线程上运行”的销毁警告。批量识别场景不要每次 new 线程复用一个 worker 加任务队列否则线程创建销毁的开销会超过识别本身。我在实际项目里是维护一个 QQueue worker 里循环取任务忙时就等信号Qt 的信号槽天然支持这种排队模型。5. 编译与调用中最容易翻车的 5 个坑现象、原因、解法5.1 qt.qpa.plugin 找不到 Windows 平台插件发布路径的玄学现象项目在 Qt Creator 里跑得好好的把 exe 单独拷出来运行弹出qt.qpa.plugin: Could not find the Qt platform plugin windows窗口起不来。原因运行时缺少 platforms/qwindows.dll。Qt Creator 启动时自动设置了 PATH 和 QT_QPA_PLATFORM_PLUGIN_PATH脱离环境后这些变量全部失效Qt 在 exe 目录找不到平台插件就报错。这和 Tesseract 编译本身无关但每个做 Qt 桌面 OCR 的人都会在打包阶段遇到。解决用 Qt 自带的 windeployqt 做完整部署。# 在 Qt 的 MSVC 64 位命令行下执行参数是 exe 的完整路径 E:\Qt\5.15.2\msvc2019_64\bin\windeployqt.exe D:\build\release\MyOcrApp.exewindeployqt 会拷贝 Qt 运行库和 platforms 插件但它不负责 Tesseract 的 DLL。发布时还得手动把 tesseract41.dll、liblept 系列 DLL 和 tessdata 目录一并放进 exe 目录。验证方法先全量部署一次再把 platforms 目录改名重现同样报错就能区分是 Qt 插件缺失还是 Tesseract DLL 缺失。5.2 链接期报 dependent 头文件路径错误Qt 5.15.2 的 include 残留现象编译报错形如:-1: error: dependent ..\..\..\..\..\..\qt\5.15.2\msvc2019_64\include\qtwidgets does not exist路径全是相对路径一层层往外拼越拼越长。原因项目之前用别的机器或别的 Qt 版本生成过 MakefileMakefile 里记录的相对路径指向了不存在的 Qt 安装目录另一个常见源头是系统环境变量 QTDIR 指向一个残留旧版本qmake 生成的 include 路径全跑到旧目录。解决先清理 QTDIR 环境变量然后强制 qmake 重新生成工程。提示Qt 相关且带一大串..\的路径错误先别怀疑 Tesseract九成是 Makefile 缓存。我通常按顺序三板斧执行qmake -r重新生成不行就删掉 build 目录整个重建再不行检查系统环境变量里有没有别人配的 Qt/VS 路径。qmake 会把检测到的 Qt 前缀写进 Makefile手动改环境变量后不重新生成路径永远带着旧值。另外 Qt 5.15.2 这类老版本配 VS2022 时偶尔因为 Windows SDK 版本号不匹配报类似错误把 SDK 切回项目稳定使用的版本即可。5.3 tesseract 初始化失败tessdata 路径和语言包没跟上现象Init 返回 -1或者 GetUTF8Text 返回空字符串程序不抛异常DLL 都齐全但识别结果一直是空。原因Init 第一个参数传成了 traineddata 文件路径而 Tesseract 期望的是 tessdata 父目录或者语言包没下载只装库不装 chi_sim.traineddata中文识别必然为空再一个是 TESSDATA_PREFIX 环境变量没设置程序在默认路径找不到语言包。解决固定语言包目录初始化时显式传路径不依赖环境变量。// tessdata 目录下必须有 chi_sim.traineddata 和 eng.traineddata api-Init(D:/tesseract-x64/tessdata, chi_simeng);验证法Init 成功后调api-GetLoadedLanguages()看返回列表里有没有 chi_sim。如果列表为空优先检查文件名和路径大小写本地路径别带中文和空格Tesseract 在 Windows 上对路径中的非 ASCII 字符处理并不可靠这一条能省掉大量排查时间。5.4 识别中文全是乱码编码和显示两层问题现象英文识别正常中文全是方块或问号或者控制台输出正常但 Qt 界面上显示乱码。原因两层。第一层是编码GetUTF8Text() 返回的 UTF-8 字符串没走 fromUtf8被按 Latin-1 解释成乱码。第二层是语言包语言名写成 eng 或者依赖默认配置Tesseract 拿英文模型硬识别中文结果自然是噪音。解决先确认语言参数再统一编码链路。QString text QString::fromUtf8(api-GetUTF8Text());同时确认 Init 第二参数是 chi_sim 或 chi_simeng。如果界面字体太老中文字符会显示成方块把 Qt 的字体换成微软雅黑或思源黑体即可。还有一个容易被忽略的点main.cpp 里如果调用了 setCodecForLocale 之类的老式 API在 Qt 5.15 已经标记废弃它会影响 char* 到 QString 的默认转换建议直接删掉。5.5 64 位程序加载 32 位 DLL位宽不匹配的连锁崩溃现象编译链接都通过一运行就报“应用程序无法正常启动”或“动态链接库初始化例程失败”甚至 ACCESS_VIOLATION 崩溃但日志里看不出是哪个库出错。原因下载了 x86 编译的 Tesseract 预编译包Qt 是 64 位套件。64 位进程加载 32 位 DLLWindows 加载器直接拒绝部分旧版库由于导入表兼容性侥幸通过链接运行期也会在调用处瞬间崩溃。解决先统一位宽再验证位宽。# 在 VS 开发人员命令行里检查 DLL 机器类型 dumpbin /headers D:\tesseract-x64\bin\tesseract41.dll | findstr /C:machine # x64 输出machine (8664) x86 输出machine (14C)Qt 套件是 msvc2019_64 或 msvc2022_64Tesseract 就必须用 x64-windows triplet 编译或用标明 x64 的预编译包。养成下载后跑 dumpbin 的习惯比事后排查崩溃快得多。和位宽伴生的还有运行库版本MSVC 2019 编的库配合 2019 的 vc_redistMSVC 2022 编的库配 2022 的 vc_redist混装用起来感觉不到问题发布到干净机器上立刻报缺 DLL。6. 把识别质量再往上提一档语言包裁剪、PageSegMode 与白名单编译版本跑通、能出中文结果之后下一个高频诉求是“识别率不够”。这里有一套我不需要重新编译 Tesseract 就能用的调优顺序按顺序调效果差别很大。第一板斧是 PageSegMode。Tesseract 默认 PSM_AUTO值 3适合整页扫描文档但票据、验证码、单行文本都要单独设置。SetPageSegMode 必须在 SetImage 之前调用// 单行数字场景比如验证码、条码 api-SetPageSegMode(tesseract::PSM_SINGLE_LINE); // 整页文档保持默认 PSM_AUTO一个模式覆盖不了所有场景PSM 影响的是 Tesseract 对版面结构的假设设错会带来大量断行噪声。实际项目中我常用的几个模式如下表PSM 值常量名适用场景3PSM_AUTO整页文档默认值7PSM_SINGLE_LINE验证码、单行数字、条码11PSM_SPARSE_TEXT票据、有细碎元素的表格13PSM_RAW_LINE不做纠错的单行识别第二板斧是白名单。数字串加白名单后准确率提升非常明显但白名单对中文几乎无效中文字符集太大硬塞白名单只会拖慢识别。第三板斧是语言包裁剪官方 chi_sim.traineddata 包含 LSTM 模型、字体渲染样本等数据体积很大但实际识别只用其中一部分要在编译 Tesseract 时打开训练工具链用 combine_tessdata 生成精简包这属于进阶玩法常规项目直接带完整语言包足够。最后建议写一个验证脚本把同一张图在不同 PSM 和白名单下的结果、耗时打出来对比for (int psm : {3, 7, 11, 13}) { api-SetPageSegMode(psm); api-SetImage(image.bits(), image.width(), image.height(), 3, image.bytesPerLine()); QElapsedTimer timer; timer.start(); QString out QString::fromUtf8(api-GetUTF8Text()); qInfo() psm: psm time: timer.elapsed() text: out; }qInfo 输出在 Qt 的默认日志环境里直接可见是最省事的验证手段。做完这三板斧大部分“编译版本能用但识别不准”的抱怨都能消掉。我自己做 OCR 项目的教训是先确认图像质量再做参数调优很多误识别其实是原图没做灰度化、二值化、去倾斜被 PSM 模式掩盖了先预处理再调识别参数顺序不能反。希望帮到你。本文还有配套的精品资源点击获取
返回列表