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(mytarget
      	org.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}
     tesseract53
     leptonica
     Qt${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.cmake

2. 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} PUBLIC
     tesseract53
     leptonica
)

6. 效果截图

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

7. 小结

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FineReport----报表模板入门

FineReport----报表模板入门教程1 FineReport就一款类Excel操作界面的报表工具&#xff0c;通过拖拖拽拽简单实现报表制作&#xff0c;实现数据展示、数据查询、数据录入功能&#xff0c;并且支持图形多样化展示。 一、入门小例子 1. 打开设计器 启动FineReport设计器&…

[NLP] Llama2模型运行在Mac机器

本文将介绍如何使用llama.cpp在MacBook Pro本地部署运行量化版本的Llama2模型推理&#xff0c;并基于LangChain在本地构建一个简单的文档Q&A应用。本文实验环境为Apple M1 芯片 8GB内存。 Llama2和llama.cpp Llama2是Meta AI开发的Llama大语言模型的迭代版本&#xff0c;…

【蓝桥杯软件赛 零基础备赛20周】第2周——常考知识点+判题

文章目录 0. 第1周答疑1. 常考知识点2. 蓝桥杯怎么判题2.1 判题系统如何判题2.2 测试数据和得分的关系2.3 自己做测试数据 3. 备赛计划4. 本周刷题 0. 第1周答疑 问题1&#xff1a;蓝桥杯怎么报名&#xff0c;什么时候报名&#xff1f; 答&#xff1a;集体报名或个人报名。大…

Appium 移动端自动化测试,触摸(TouchAction) 与多点触控(MultiAction)

一、触摸 TouchAction 在所有的 Appium 客户端库里&#xff0c;TouchAction 触摸对象被创建并被赋予一连串的事件。 规范里可用的事件有&#xff1a; * 短按(press) * 释放(release) * 移动到(moveTo) * 点击(tap) * 等待(wait) * 长按(longPress) * 取消(cancel) * 执行(per…

记录腾讯云重置密码之后ssh就连不上的踩坑

腾讯云轻量级服务器SSH连不上 解决方案在最后&#xff0c;点我跳转 问题背景&#xff1a; 首先ssh ubuntu用户我是能用xshell带上密钥正常连接的 其次我重置了root密码&#xff0c;自己改了一个root密码&#xff0c;因为我要用root账号使用ftp传输文件 然后重置密码之后&…

设计模式—结构型模式之桥接模式

设计模式—结构型模式之桥接模式 将抽象与实现解耦&#xff0c;使两者都可以独立变化。 在现实生活中&#xff0c;某些类具有两个或多个维度的变化&#xff0c;如图形既可按形状分&#xff0c;又可按颜色分。如何设计类似于 Photoshop 这样的软件&#xff0c;能画不同形状和不…

Chrome插件精选 — 广告拦截插件

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件挑选出比较好用的一款或几款&#xff0c;尽量满足界面精致、功能齐全、设置选项丰富的使用要求&#xff0c;便于节省一个个去尝试的时间和精力。 1. Adblock Plus 广…

Qt应用开发--国产工业开发板T113-i的部署教程

Qt在工业上的使用场景包括工业自动化、嵌入式系统、汽车行业、航空航天、医疗设备、制造业和物联网应用。Qt被用来开发工业设备的用户界面、控制系统、嵌入式应用和其他工业应用&#xff0c;因其跨平台性和丰富的功能而备受青睐。 Qt能够为工业领域带来什么好处&#xff1a; - …

最受欢迎的程序员副业排行榜TOP6

程序员接单的情况并不少见&#xff0c;因为程序员职业工种的特殊性&#xff0c;能够比较快的衔接上新项目和新技术&#xff0c;所以接私活做副业成了许多程序员的不二之选。 程序员的副业是指程序员在业余时间里从事与编程相关的兼职工作&#xff0c;或者是与技术相关的创业项…

【渗透测试】垂直越权(高危)、水平越权(中危)

目录 一、简介1.1 水平越权&#xff08;中危&#xff09;1.2 垂直越权&#xff08;高危&#xff09;1.3 方便记忆方法 二、修复方案2.1 水平越权修复2.2 垂直越权修复 一、简介 1.1 水平越权&#xff08;中危&#xff09; 漏洞危害&#xff1a; 水平越权 是相同级别&#xff0…

Photoshop图片处理

工具 Photoshop剪映 步骤 打开photoshop 工具主界面 2. 导入素材图片 或者直接将图片拖入主界面 3. 双击图层&#xff0c;将背景图改为可编辑图层 4. 使用多边形套索工具勾画需要搽除的区域 5. 希望删除的区域使用多边形套索工具勾画出来后&#xff0c; 按“del”键&a…

Flink SQL时间属性和窗口介绍

&#xff08;1&#xff09;概述 时间属性&#xff08;time attributes&#xff09;&#xff0c;其实就是每个表模式结构&#xff08;schema&#xff09;的一部分。它可以在创建表的 DDL 里直接定义为一个字段&#xff0c;也可以在 DataStream 转换成表时定义。 一旦定义了时间…

菜鸟打印组件系列-vue3快速接入

文章目录 前言1. 相关名词或语句2. CAINIAO打印组件能力3. 安装与下载4. vue3集成步骤4.1 使用pina 创建websoket相关处理的模块。4.2 创建本地自定义模板&#xff08;要打印的模板以及样式&#xff09;4.3 结合el-table &#xff0c;实现批量打印 总结 前言 文章主要记录不注…

Kubernetes Dashboard 用户名密码方式登录

Author&#xff1a;rab 前言 为了 K8s 集群安全&#xff0c;默认情况下 Dashboard 以 Token 的形式登录的&#xff0c;那如果我们想以用户名/密码的方式登录该怎么操作呢&#xff1f;其实只需要我们创建用户并进行 ClusterRoleBinding 绑定即可&#xff0c;接下来是具体的操作…

【Docker】Docker中 的AUFS、BTRFS、ZFS、存储池概念的详细讲解

前言 作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&…

Jupyter Notebook交互式开源笔记本工具

1、官网 http://jupyter.org/ 2、什么是Jupyter Notebook Jupyter Notebook一个交互式的开源笔记本工具&#xff0c;可以用于编写、运行、和共享代码、文本、图形等内容。 如下文本、代码、图形 支持多种编程语言&#xff0c;包括python、R和Julia等&#xff0c;可以走一个…

【elasticsearch+kibana基于windows docker安装】

创建网络&#xff1a;es和kibana容器互联 docker network create es-net加载镜像 docker pull elasticsearch:7.12.1运行 docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -v $…

【ES专题】ElasticSearch搜索进阶

目录 前言阅读导航前置知识特别提醒笔记正文一、分词器详解1.1 基本概念1.2 分词发生的时期1.3 分词器的组成1.3.1 切词器&#xff1a;Tokenizer1.3.2 词项过滤器&#xff1a;Token Filter1.3.3 字符过滤器&#xff1a;Character Filter 1.4 倒排索引的数据结构 <font color…

Nacos本地修改编译源码2.2.3

下载Nacos源码 由于github访问速度慢&#xff0c;所以在gitee上下载 git clone https://gitee.com/mirrors/Nacos.git切换2.2.3版本 git checkout 2.2.3或者直接下载2.2.3的源码 本地编译 源码导入idea&#xff0c;然后编译 mvn -Dmaven.test.skiptrue -Drat.skiptrue c…

【owt】p2p client mfc 工程梳理

1年前构建的,已经搞不清楚了。所以梳理下,争取能用较新的webrtc版本做测试。最早肯定用这个测试跑通过 【owt】p2p Signaling Server 运行、与OWT-P2P-MFC 交互过程及信令分析官方的mfc客户端 估计是构造了多个不同的webrc版本的客户端