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
想说的也说完了,大功告成!
相关文章:

Qt利用VCPKG和CMake和OpenCV和Tesseract实现中英文OCR
文章目录 1. 开发平台2. 下载文件2.1 下载安装 OpenCV 库2.2 下载安装 Tesseract-OCR库2.3 下载训练好的语言包 3. CMakeLists.txt 内容4. Main.cpp4.1 中英文混合OCR 5. 在Qt Creator 中设置 CMake vcpkg5.1 在初始化配置文件里修改5.2 在构建配置里修改 说明:在Q…...

Day20力扣打卡
打卡记录 数组中两个数的最大异或值(位运算) 链接 二进制位上从高位向低位进行模拟,看数组中是否有满足此情况的数字。具体题解 class Solution { public:int findMaximumXOR(vector<int>& nums) {int mx *max_element(nums.be…...

设计模式之两阶段终止模式
文章目录 1. 简介 2. 常见思路3. 代码实战 1. 简介 两阶段终止模式(Two-Phase Termination Pattern)是一种软件设计模式,用于管理线程或进程的生命周期。它包括两个阶段:第一阶段是准备阶段,该阶段用于准备线程或进程…...

Dubbo捕获自定义异常
一.问题描述 Dubbo远程服务提供者抛出的自定义异常无法被消费方正常捕获,消费方捕获的自定义异常全部变成RuntimeException,使用起来很不方便。 二.原因分析 相关源码 /** Licensed to the Apache Software Foundation (ASF) under one or more* con…...

Leetcode刷题详解——求根节点到叶节点数字之和
1. 题目链接:129. 求根节点到叶节点数字之和 2. 题目描述: 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1…...

emq集群配置nginx做负载均衡
emq集群配置nginx做负载均衡 创建 EMQ X 节点集群 emqx 集群搭建 例如: 节点IP 地址emqx192.168.1.17192.168.1.17emqx192.168.1.18192.168.1.18emqx192.168.1.19192.168.1.19 配置 /etc/nginx/nginx.conf mqtt集群搭建并使用nginx做负载均衡_亲测得结论 示例: vim /et…...

【JAVA学习笔记】60 - 坦克大战1.0-绘图坐标体系、事件处理机制
项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter16/src/com/yinhai 绘图坐标体系 一、基本介绍 下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为…...

Android13 安装谷歌GMS导致打开蓝牙失败解决方法
Android13 安装谷歌GMS导致打开蓝牙失败解决方法 文章目录 Android13 安装谷歌GMS导致打开蓝牙失败解决方法一、前言二、解决方法1、简单的解决方法2、添加属性和日志解决 三、分析1、查看异常日志2、 查看蓝牙相关日志 四、总结1、Android13 安装谷歌GMS导致打开蓝牙失败具体原…...

独创改进 | RT-DETR 引入双向级联特征融合结构 RepBi-PAN | 附手绘结构图原图
本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 文章目录 YOLOv6贡献RepBi-…...

Ubuntu下安装vscode,并解决终端打不开vscode的问题
Visual Studio Code安装 1,使用 apt 安装 Visual Studio Code 在官方的微软 Apt 源仓库中可用。按照下面的步骤进行即可: 以 sudo 用户身份运行下面的命令,更新软件包索引,并且安装依赖软件: sudo apt update sud…...

Spring Boot Actuator 漏洞利用
文章目录 前言敏感信息泄露env 泄露配置信息trace 泄露用户请求信息mappings 泄露路由信息heapdump泄露堆栈信息 前言 spring对应两个版本,分别是Spring Boot 2.x和Spring Boot 1.x,因此后面漏洞利用的payload也会有所不同 敏感信息泄露 env 泄露配置信…...

acwing算法基础之数据结构--trie算法
目录 1 基础知识2 模板3 工程化 1 基础知识 trie树算法,也叫作字典树算法。 用处:用来高效存储和查找字符串集合的数据结构。 (一) 定义变量。 const int N 1e5 10; int son[N][26], cnt[N], idx; char str[N];(二…...

ES from+size>10000报错
参考博客 from size > 10000就会报错 Result window is too large, from size must be less than or equal to: [10000] but was [10001]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_…...

(04)Mycat实现分库
1、如何选择分库表 #客户表 rows:20万 CREATE TABLE customer(id INT AUTO_INCREMENT,NAME VARCHAR(200),PRIMARY KEY(id) );#订单表 rows:600万 CREATE TABLE orders(id INT AUTO_INCREMENT,order_type INT,customer_id INT,amount DECIMAL(10,2),PRIMARY KEY(id) ); #…...

DeepSORT多目标跟踪——算法流程与源码解析
一、目标检测与目标追踪 1. 目标检测 在目标检测任务中,主要目标是识别图像或视频帧中存在的物体的位置和类别信息。这意味着目标检测算法需要定位物体的边界框(Bounding Box)并确定每个边界框内的物体属于哪个类别(如人、汽车、…...

C++查漏补缺与新标准(C++20,C++17,C++11)02 C++快速回顾(二)
本内容参考C20高级编程 C风格的数组 //形如 int myArray[3]{2};一个比较新颖的获取C风格数组大小的函数std::size(),返回size_t类型(在中定义的无符号整数) #include <iostream> using namespace std;int main() {int myArray[5] {…...

红米K40功能介绍
红米K40是小米旗下的一款高性能智能手机。以下是红米K40的一些功能介绍及新增功能: 1.高性能处理器:红米K40搭载了骁龙870处理器,提供强大的性能和流畅的操作体验。 2.120Hz刷新率屏幕:红米K40采用了6.67英寸的AMOLED全面屏&…...

壹[1],Opencv常用结构
1,Point类:点表示 point表示二维结构的点,(x,y) cv::Point point; point.x 100; point.y 100; 2,Scalar类:颜色表示 cv::Scalar colorBlue(255,0,0);//蓝色 cv::Scalar colorGreen(0, 255, 0);//绿色 cv::Scalar colorRed(0, …...

Linux常用指令(一)——目录操作
Linux目录操作 1.1 目录切换 cd1.2 目录查看 ls1.3 创建目录 mkdir1.4 删除目录 rm1.5 复制目录 cp1.6 删除目录 rm1.7 搜索目录 find1.8 查看当前所在目录 pwd 更加完整的Linux常用指令 1.1 目录切换 cd # 切换到根目录 cd / # 切换到根目录的usr目录 cd /usr # 返回上一级目…...

前端基础之jQuery
一.什么是jQuery jQuery是一个轻量级的、兼容多浏览器的JavaScript库。jQuery使用户能够更方便地处理HTML Document、Events、实现动画效果、方便地进行Ajax交互,能够极大地简化JavaScript编程。它的宗旨就是:“Write less, do more.“ jQuery内部封装了…...

【基于HTML5的网页设计及应用】——实现个人简历表格和伪类选择器应用
🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL:…...

思考(九十二):DBProxy实现多级存储和事务处理
DBProxy 数据处理的主控室 后端开发一块重要的内容就是如何处理数据。比如: 问题说明统一的访问界面如游戏服只需要 Load、Save、Begin、Commit、Rollback 接口多级存储来降低成本如热数据在 Redis ;冷数据在 MySQL ;长时间非活跃,则归档 OSS同个逻辑涉及多个数据更新要么…...

新手入门Python一定要看的八个超实用建议!
文章目录 前言一、项目文件事先做好归档二、永远不要手动修改源数据并且做好备份三、做好路径的正确配置四、代码必要的地方做好备注与说明五、加速你的Python循环代码六、可视化你的循环代码进度七、使用高效的异常捕获工具八、要多考虑代码健壮性关于Python技术储备一、Pytho…...

Centos 7.x上利用certbot申请Let‘s Encrypt的SSH证书(HTTPS证书)
目录 01-安装Certbot02-在网站的根目录依次新建文件夹.well-known和acme-challenge03-申请证书 要在CentOS 7.x上为域名申请Let’s Encrypt证书,你可以使用Certbot工具,它是一个自动化证书颁发工具,用于管理Let’s Encrypt证书。以下是在Cent…...

采用springboot、avue框架开发的:大型医院绩效考核系统成品源码
医院绩效考核系统全套源码(演示自主版权医院应用案例) 医院绩效考核系统,建立以医院发展目标为导向,以医务人员劳动价值、工作量为评价基础,统筹效率、质量、成本的绩效管理和绩效工资分配体系。系统支持RBRVS…...

时序分解 | Matlab实现FEEMD快速集合经验模态分解时间序列信号分解
时序分解 | Matlab实现FEEMD快速集合经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现FEEMD快速集合经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现FEEMD快速集合经验模态分解时间序列信号分解 算法新颖小众,…...

自学SLAM(6)相机与图像实践:OpenCV处理图像与图像拼接(点云)
前言 如果写过SLAM14讲第一次的作业,或者看过我之前的运行ORB_SLAM2教程应该都安装过OpenCV了,如果没有安装,没关系,可以看我之前的博客,里面有如何安装OpenCV。 链接: 运行ORB-SLAM2(含OpenCV的安装&…...

伊朗网络间谍组织针对中东金融和政府部门
导语 近日,以色列网络安全公司Check Point与Sygnia发现了一起针对中东金融、政府、军事和电信部门的网络间谍活动。这一活动由伊朗国家情报和安全部门(MOIS)支持的威胁行为者发起,被称为"Scarred Manticore"。该组织被认…...

基于51单片机土壤湿度检测及自动浇花系统仿真(带时间显示)
wx供重浩:创享日记 对话框发送:单片机浇花 获取完整源码源文件仿真源文件原理图源文件论文报告等 单片机土壤湿度检测及自动浇花系统仿真(带时间显示) 具体功能: (1)液晶第一行显示实际湿度&am…...

typeScript基础使用与进阶
typeScript基础使用与进阶 一、初始typeScript1.1 js的超集1.2 编译器编译为js代码1.3 完全兼容js1.4 静态类型检查器 二、ts的安装与编译2.1 ts的安装2.2 ts编译成js2.2.1 手动编译2.2.2 自动编译 三、ts基础使用3.1 类型声明3.1.1 基础类型3.1.2 数组3.1.3 对象3.1.4 any类型…...