Qt利用VCPKG和CMake和OpenCV和Tesseract实现中英文OCR

文章目录

  • 1. 开发平台
  • 2. 下载文件
    • 2.1 下载安装 OpenCV 库
    • 2.2 下载安装 Tesseract-OCR库
    • 2.3 下载训练好的语言包
  • 3. CMakeLists.txt 内容
  • 4. Main.cpp
    • 4.1 中英文混合OCR
  • 5. 在Qt Creator 中设置 CMake + vcpkg
    • 5.1 在初始化配置文件里修改
    • 5.2 在构建配置里修改
  • 说明:在Qt工程中CMake使用vcpkg安装的库
  • 6. 效果截图
  • 7. 小结

Qt利用VCPKG和CMake和OpenCV和Tesseract实现中英文OCR

  今天看 OpenCV 方面的教程,pdf 格式的,因为一些强迫症的习惯,喜欢添加一些书签,手动是不太愿意的,自然就想到利用OCR来实现。

  想要自己编码实现OCR,方案比较简单就是 Tesseract 。单独使用 Tesseract 也可以,但最好利用 OpenCV 来进行图像方面的处理,一大堆方法可以滤波,变换,就是不停地调参数让人心烦,不同的图,需要使用不同的方法,也不清爽。出于总结的需要,把过程记录下。

  这个项目就是个Demo,比较简单,网上的水货,只有 Qt Creator 和 CMake 和 vcpkg 的配合使用 ,有点参考价值。

1. 开发平台

  • os : win10 x64
  • Qt:6.6
  • compiler:msvc2022
  • 项目管理:cmake
  • 包管理: vcpkg
  • 开发库版本:
    • OpenCV : 4.8 ,这个很友好,有编译出来的库,不需要自己去弄
    • Tesseract-ocr : 5.3 巨坑,二进制文件为啥不包含lib ? 🤯

2. 下载文件

  • 先说说踩过的坑,希望有相关经验的大佬,给点指点吧。

    • Tesseract 的坑

      在 Tesseract 的 https://github.com/tesseract-ocr/tesseract#installing-tesseract,有二进制包,兴冲冲地下载后,一看原来不是库文件,是可执行文件,这如何编码,用进程对话来实现?这包何用,对开发无益

      tesseract-ocr-w64-setup-5.3.3.20231005.exe (64 bit) 安装后 没有lib库,只有可执行文件

    • sw 坑

      既然没有 Tesseract 现成的库,那就需要自己编译了,在Tesseract 上接触到了 sw,这也是一个包管理方面的东西,关键是会自动下载,自动解决包依赖的问题,看上去很方便,兴冲冲地下载使用,发现网速也是刚刚的,cmake 也能使用,看看文档 下载添加环境变量在cmake设置依赖的包,然后等待成功吧。

      find_package(SW REQUIRED)
      sw_add_package(org.sw.demo.glennrp.png
      )
      sw_execute()add_executable(mytarget ${MY_SOURCES})
      target_link_libraries(mytargetorg.sw.demo.glennrp.png
      )
      

      看上去很美好,但是 sw_execute() 这一步时间长的也是让人醉了,只要CMakeFiles.txt 一有变动,这玩意就会折腾好一阵子。

      有大佬会的么,指点一下细节。这东西看上去不错,值得鼓掌和期待。希望好起来吧。

      还有个swgui的客户端,也是折腾了一下,但是最后也没掌握,也搞不懂。遂弃之。

2.1 下载安装 OpenCV 库

  这一步很简单,官网有很多版本的,我就找了一个最新的

  Releases - OpenCV
在这里插入图片描述

下载安装,添加环境变量就行。就可以省略向生成的目录下 复制 dll 的步骤。

2.2 下载安装 Tesseract-OCR库

  踩过了SW的坑,还是回到了VCPKG。利用 IDM 和 迅雷 实现手动加速网络。过程比较繁琐,但是没啥难度。另外使用PowerShell 会方便一点。

vcpkg install tesseract --triplet=x64-windows

具体步骤:

  • 执行 vcpkg install tesseract --triplet=x64-windows
  • ctrl + c 中断
  • 复制下载链接,手动 IDM 或者 迅雷
  • 重命名
  • 继续 执行 vcpkg install tesseract --triplet=x64-windows

慢慢征途,应该有本小说在伴。祝网速好运。

另外不要自己去手动编译 Tesseract 库,这库依赖也多,依赖 leptonica 、archive.dll、bz2.dll、clang_rt.asan_dynamic-x86_64.dll、gif.dll、jpeg62.dll、libcrypto-3-x64.dll、libcurl.dll、liblzma.dll、libpng16.dll、libsharpyuv.dll、libwebp.dll、libwebpmux.dll、lz4.dll、openjp2.dll、tiff.dll、zlib1.dll、zstd.dll,烦透啦。

2.3 下载训练好的语言包

  • tessdata_best: https://github.com/tesseract-ocr

  • eng.traineddata 和 chi_sim.traineddata

  • 点击进去下载raw

3. CMakeLists.txt 内容

cmake_minimum_required(VERSION 3.24)project(36_Opencv4_Tesseract_OCR LANGUAGES CXX)#set(CMAKE_CXX_STANDARD 17)
#set(CMAKE_CXX_STANDARD_REQUIRED ON)##################### 设置 QT库   #####################
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)# 添加自定义代码的 include 和 source 路径
#include_directories  (D:/Project/qt_common_tools/global_define)
#aux_source_directory (D:/Project/qt_common_tools/global_define COMMON_TOOLS_LIST)find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core )
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core )##################### vcpkg 库  #####################
#寻找 TESSERACT 库
FIND_PACKAGE(tesseract REQUIRED)
#寻找 LEPTONICA 库
FIND_PACKAGE(leptonica REQUIRED)##################### opencv 库  #####################
set(OpenCV_DIR C:/OpenCV/opencv/build)#寻找OpenCV库
FIND_PACKAGE(OpenCV REQUIRED)##打印调试信息
#MESSAGE(STATUS "Project: ${PROJECT_NAME}")
#MESSAGE(STATUS "OpenCV library status:")
#MESSAGE(STATUS "    version: ${OpenCV_VERSION}")
#MESSAGE(STATUS "    libraries: ${OpenCV_LIBS}")
#MESSAGE(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")##################### 修改入口点  #####################
# 设置程序为 windows 程序 修改入口点,不显示 console
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:mainCRTStartup")#################### 内存泄露检查 #####################
#SET(CMAKE_CXX_FLAGS "-fsanitize=address")#获取代码,在项目中,将所有代码都放在src文件夹中
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
#MESSAGE(STATUS "Src file: ${DIR_SRCS}")#################### 设置源码编码  ####################
#add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>")
#add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/execution-charset:GBK>")#{{{{{{{{{{{{{{{{{{{ 编译可执行程序 }}}}}}}}}}}}}}}}}}}}#
add_executable( ${PROJECT_NAME}
#    WIN32${DIR_SRCS}${COMMON_TOOLS_LIST}
)#################### 添加链接库    #####################
set(VCPKG_INCLUDE_DIR C:/vcpkg/installed/x64-windows/include)
set(VCPKG_LIB_DIR     C:/vcpkg/installed/x64-windows/lib)# 头文件路径
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC ${VCPKG_INCLUDE_DIR})# lib文件路径
TARGET_LINK_DIRECTORIES(${PROJECT_NAME}PUBLIC${VCPKG_LIB_DIR})# lib文件
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC${OpenCV_LIBS}tesseract53leptonicaQt${QT_VERSION_MAJOR}::Core
)# 设置默认打开VCPKG
#set_target_properties(${PROJECT_NAME} PROPERTIES VS_GLOBAL_VcpkgEnabled true)#################### 设置app ico  #####################
##set(app_icon_resource_windows ${CMAKE_CURRENT_SOURCE_DIR}/logo.rc)
##message(STATUS "${app_icon_resource_windows}")

4. Main.cpp

//#include "chinese.h"
#include "qdebug.h"#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <tesseract/baseapi.h> // tesseract main header#include <QBuffer>
using namespace cv;int main()
{std::string image_name = "txt.jpg";Mat imageMat;imageMat = imread(image_name);// imshow(ANSI("原图"), imageMat);imshow("origin", imageMat);if (imageMat.empty()) {printf("No image data \n");return -1;}// Rect ccomp;// floodFill(imageMat,Point(3,3),Scalar(255,255,255),&ccomp,Scalar(10,10,10),Scalar(20,20,20));cv::cvtColor(imageMat, imageMat, cv::COLOR_BGR2GRAY);char *outText;tesseract::TessBaseAPI tessbaseApi;if (tessbaseApi.Init("./", "chi_sim+eng")) { // chi_sim+eng  把下载的语言包 和 可执行文件放到一起std::cout << stderr << std::endl;exit(1);}// tesseract 设置图片tessbaseApi.SetImage((uchar *) imageMat.data, imageMat.cols, imageMat.rows, 1, imageMat.cols);// 获取 ocr 结果outText = tessbaseApi.GetUTF8Text();if (outText == nullptr) {std::cout << "没有数据" << std::endl;}QBuffer buf;buf.setData(outText);buf.open(QIODevice::ReadOnly);while (!buf.atEnd()) {QString line = buf.readLine();// line = removedSpaceInterChinese(line); // 自定义的函数 , 移除中文之间的空格 可以不考虑if (!line.trimmed().isEmpty())qDebug() << line;}delete[] outText;waitKey();return 0;
}

4.1 中英文混合OCR

tessbaseApi.Init("./", "chi_sim+eng")  

使用 + 号 连接 chi_sim、eng 就行

5. 在Qt Creator 中设置 CMake + vcpkg

cmake导入库: 可以手动编写 ,但既然能够偷懒,为啥要动手 O(∩_∩)O

但是第一步还得手动:

5.1 在初始化配置文件里修改

在这里插入图片描述
如果切换编译模式 realease —> debug 也得手动添加 /(ㄒoㄒ)/~~

5.2 在构建配置里修改

刚刚又捣鼓出来了一个,直接在 工具配置里 添加 -DCMAKE_TOOLCHAIN_FILE:STRING=C:/vcpkg/scripts/buildsystems/vcpkg.cmake 就行

推荐指数:⭐⭐⭐⭐⭐
在这里插入图片描述

说明:在Qt工程中CMake使用vcpkg安装的库

# 在Qt工程中使用vcpkg安装的库,改成自己的vcpkg安装目录
1. qt 在项目中添加
CMAKE_TOOLCHAIN_FILE   C:/vcpkg/scripts/buildsystems/vcpkg.cmake2. CMakeList.txt
##################### vcpkg 库  #####################
#寻找 TESSERACT 库
FIND_PACKAGE(tesseract REQUIRED)#寻找 LEPTONICA 库
FIND_PACKAGE(leptonica REQUIRED)#################### 链接库    #####################
set(VCPKG_INCLUDE_DIR C:/vcpkg/installed/x64-windows/include)  // 这一步其实也可以修改,不用绝对路径
set(VCPKG_LIB_DIR     C:/vcpkg/installed/x64-windows/lib)# 头文件路径
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC ${VCPKG_INCLUDE_DIR})# lib文件路径
TARGET_LINK_DIRECTORIES(${PROJECT_NAME}PUBLIC${VCPKG_LIB_DIR})# lib文件
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLICtesseract53leptonica
)

6. 效果截图

在这里插入图片描述
在这里插入图片描述

7. 小结

构建套件:Desktop Qt 6.6 MSVC2019 64bit 可以使用 MSVC2022 版的c 和 c++的编译器,也算方便。如果msvc添加了142生成工具,那也可以手动添加编译,选择 msvc2019模式就行。

如果没有使用Qt的模块【就这个程序而言,完全可以不用qt】,用std::cout 输出,会发现 QC的应用程序输出框全是乱码,但是不要慌!

用cmd去执行程序,代码页切换到utf-8 : chcp 65001

想说的也说完了,大功告成!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/162168.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PYTHON学习

元组不可修改&#xff1a; 元组支持下标索引。 字符串也是容器&#xff0c;不支持修改。 容器转换&#xff0c;alt鼠标点击

限制LitstBox控件显示指定行数的最新数据(3/3)

实例需求&#xff1a;由于数据行数累加增加&#xff0c;控件加载的数据越来越多&#xff0c;每次用户都需要使用右侧滚动条拖动才能查看最新数据。 因此希望ListBox只加载最后10行数据&#xff08;不含标题行&#xff09;&#xff0c;这样用户可以非常方便地选择数据&#xff…

【Kubernetes部署】通过Kubeadm部署Kubernetes高可用集群

Kubeadm 一、kubeadm部署思路二、基本架构2.1 资源分配2.2 系统初始化操作&#xff08;所有节点&#xff09;2.2.1关闭防火墙、selinux和swap分区2.2.2 修改主机名&#xff0c;添加域名映射2.2.3 内核相关2.2.4 加载ip_vs模块2.2.5 时间同步 三、部署docker3.1 通过yum安装dock…

Langchain知识点(下)

背景&#xff1a; 这部分给主要介绍Langchain的agent部分&#xff0c;前面已经章节已经介绍了思维和思路作为一种数据资产是这一次LLM数据化的核心。也介绍了各种的chain&#xff0c;那么既然有了chain可以把专家思路和专家思维固化并且可被方便的共享和利用&#xff1b;那为什…

libpthread.so.0: cannot open shared object file: No such file or directory

linux 系统下 /lib64/libpthread so 库文件千万不要修改&#xff0c;不然后果很严重&#xff0c;像我好奇把/lib64/libpthread-2.17.so 改成 libpthread-2.17.so.old&#xff0c;因为 libpthread.so 和 libpthread.so.0 都是软链接&#xff0c;最终链接到的是 libpthread-2.17…

mac电脑邮件附件清理工具CleanMyMacX2024

邮件附件清理功能可以保证在收件箱中原始附件的安全性的基础上&#xff0c;清理邮件下载和附件的本地副本&#xff0c;回收大量的磁盘空间。 在默认情况下&#xff0c;当您打开或者查看新的邮件附件时&#xff0c;应用程序将将其副本存储到磁盘上直到您删除相关的电子邮件。在…

免费记课时小程序-全优学堂

1. 教师使用小程序记上课 使用步骤 创建了员工账号&#xff0c;员工需设置为教师为班级进行排课使用系统账号绑定小程序&#xff0c;记上课 #1.1 创建员工账号 通过系统菜单’机构设置->员工管理‘&#xff0c;添加本机构教师及其他员工。 添加过程中&#xff0c;可设置…

瓦斯抽采VR应急救援模拟仿真系统筑牢企业安全生产防线

矿工素质对安全生产的影响很大。传统的煤矿安全事故培训出于条件差、经验少加上侥幸心理&#xff0c;导致其在教学内容时过于简单且不切合实际&#xff0c;无法真正发挥培训作用。瓦斯检查作业VR模拟实操培训通过真实还原煤矿作业环境&#xff0c;让受训者身临其境地进入三维仿…

opencv在linux上调用usb摄像头进行拍照

功能 1.按照指定的文件名创建文件夹&#xff0c;创建之前判断该文件夹是否存在 2.调用摄像头按可调整窗口大小的方式显示 3.按esc退出摄像头画面 4.按p保存当前摄像头的画面&#xff0c;并按当前时间为照片的名字进行保存打开终端查看是否有摄像头 ls /dev/video*一般video1就…

测试老鸟整理,Postman加密接口测试-Rsa/Aes对参数加密(详细总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一些问题 postma…

淘宝API商品详情接口丨关键词搜索接口丨用户评论接口丨淘宝销量接口

淘宝API商品详情接口&#xff0c;关键词搜索接口&#xff0c;用户评论接口&#xff0c;淘宝销量接口如下&#xff1a; 淘宝/天猫获得淘宝商品详情 API 返回值说明 item_get-获得淘宝商品详情 1.公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在…

VR博物馆:让博物馆传播转化为品牌影响力

随着VR技术的不断进步&#xff0c;VR全景技术已经成为了文化展示和传播的一项重要工具&#xff0c;相较于传统视频、图文等展现方式&#xff0c;VR全景体验更加直观、便捷&#xff0c;其中蕴涵的信息量也更加丰富&#xff0c;这也为公众了解博物馆和历史文化带来了更为深刻的体…