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


    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
        )
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11

        看上去很美好,但是 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
    
    • 1

    具体步骤:

    • 执行 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 下载训练好的语言包

    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}")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    4.1 中英文混合OCR

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

    使用 + 号 连接 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
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    6. 效果截图

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

    7. 小结

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

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

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

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

  • 相关阅读:
    从0开始学习JavaScript--JavaScript 循环与迭代详解
    The_Maya_Society
    java基于微信小程序的游戏外包管理信息系统 uniapp 小程序
    2022算法分析与练习十六
    Docker中搭建Elasticsearch+Kibana
    [4G/5G/6G专题基础-160]: 5G双链接与MCG/SCG/PCell/PSCell/SCell
    Spring 源码阅读:用于创建 AOP 代理的后处理器分析
    基于Java+微信小程序实现《电子点餐系统》
    [C++网络协议] I/O复用
    Ubuntu20.04编译Linux内核
  • 原文地址:https://blog.csdn.net/hitzsf/article/details/134223876