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内部封装了…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...

路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...