文章目录

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 在构建配置里修改

说明:在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 x64Qt:6.6compiler: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-windowsctrl + 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("$<$:/source-charset:utf-8>")

#add_compile_options("$<$:/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

#include

#include

#include // tesseract main header

#include

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

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

好文推荐

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。