zoukankan      html  css  js  c++  java
  • Win10 + vs2017 编译并配置tesseract4.1.0

      tesseract 是一个开源的OCR (Optical Character Recognition , 光学字符识别) 引擎,本文就介绍一下自己在编译 tesseract4.1.0时遇到的一些坑,希望能给大家带来一些帮助。

    一、下载 tesseract

      tesseract 是一个开源项目,可以在 GitHub 上下载源码:https://github.com/tesseract-ocr/tesseract/releases/ 

      当然,也可以下载安装版的:https://github.com/UB-Mannheim/tesseract/wiki 

       安装版的下载完后直接安装,然后配置环境变量(这个后面会讲到)即可使用。这个方法笔者也尝试过,但是很遗憾,没能在 vs 上找到相关的库文件,也就是不能在 vs 中调用 tesseract 相关的函数方法,只能在控制台上使用,这就比较蛋疼了,暂时在网上也没找到相关的方法,所以只能下个源码包自己编译配置了,折腾了一天才搞定,不得不吐槽一下在 Windows 上想自己编译一个东西真是麻烦。

     

    二、所需要用到的工具

      在 Windows 上编译 tesseract 主要需要用到两个工具:cmake和 cppan。

    2.1 cmake

      cmake 是一个跨平台的编译工具 ,可以使用 cmake 在 Windows 上将源码编译成你想要的文件(比如说电脑上装了 visual studio,那么就可以生成 .sln 文件),在 Linux 上使用 cmake 的话,则可以生成 makefile 文件,可以说功能非常强大了。

      Windows 上安装 cmake 很简单,直接下载可安装文件后一键安装就行:https://cmake.org/download/

     

       需要下载哪个是自己系统而定,笔者下载的是cmake-3.14.2-win64-x64.msi ,这个是可以直接安装的。安装完后,记得将 cmake 安装目录下的 /bin 目录添加到 path 环境变量中去(本人的相应目录是 D:Program FilesCMakein )。配置完环境变量后,就可以在命令行使用 cmake 命令了。

     

    2.2 cppan

      cppan 是一个跨平台的 C/C++ 依赖管理器。它建立在CMake之上,还具有构建系统功能。CPPAN支持快速脚本式编码和原型设计以及处理大型项目。查找,共享和重用库,发布项目。 使用 CPPAN 可以让你把时间花费在处理代码而不是管理依赖项上。CPPAN 可以为您将获取包的时间减少到秒!它支持轻松交叉编译,继承和推送您自己的设置,标记每个依赖项。(注:以上介绍来自 CPPAN 英文介绍机翻,英文不好望见谅)。

      可以在 https://cppan.org/client/ 这里下载 cppan 的安装包,本人下载的是 cppan-master-Windows-client.zip 文件。

      下载好安装包后直接解压,可以发现一个 cppan.exe 文件,也不需要双击这个文件安装什么的,只需要将这个文件所在目录添加到 path 环境变量中去就行了。(笔者的目录是 D:cppan,则直接把这个目录添加到环境变量 path 中去就行)。配置好环境变量后就可以在命令行使用 cppan 命令了。

      

    三、从源代码编译安装 tesseract

      从源代码编译安装 tesseract 的基本步骤 GitHub 上有讲,按照 GitHub 上提供的方法来就行:https://github.com/tesseract-ocr/tesseract/wiki/Compiling

    1)下载安装 cppan

    2)下载安装 cmake

    3)打开 Windows 命令行并进入 tesseract 源码目录(目录最好为全英文);

    4)在 tesseract 目录下依次运行下述命令:

    cppan
    
    mkdir build && cd build
    
    cmake ..

       完成后,可以在 /tesseract/build 目录下看到一个 tesseract.sln 文件,说明 tesseract 源码编译成功了。(注:在运行 cppan 命令后,会下载一系列东西,耐心等待即可)。

    5)上述命令编译完成后是 x86 平台上的解决方案,若需要 x64 平台上的解决方案可以这样:

    mkdir bulid_win64 && cd bulid_win64
    cppan ..
    cmake ..
    -G "Visual Studio 15 2017 Win64"

      如果需要在 vs2015 上使用 tesseract,只需要将 15 2017 改成 14 2015 即可。

     

    四、在 vs2017 上编译 tesseract

      用 cmake 编译完源码后,虽然生成了解决方案,但是还需要在 vs2017 上对该解决方案进行编译才能生成 tesseract 的可执行文件及相关库文件,步骤如下:

    1)进入目录 /tesseract/bulid ,找到 tesseract.sln 文件,使用 vs2017 以管理员方式打开它!(这很重要,我第一次就是没用管理员方式打开才会报错的)。 以管理员方式启动 vs 程序的方法可以参考:https://blog.csdn.net/lien0906/article/details/47300881 ;

    2)选择解决方案平台,x86 平台则选择 x86,x64 平台则选择 x64;

    3)在解决方案资源管理器中,右键解决方案 tesseract,选择生成解决方案。

      理论上说,已经完成了,但是现实总是残酷的,错误警报。。。

    1)cppan-d-b-d 乱码问题:大部分错误都是乱码引起的,这是文件编码的问题。cppan 下载的文件是 UTF-8(不带签名),而 vs2017 中文版默认保存的文本文件是 GB2312 编码。

    解决方法如下:双击错误行,打开相应的文件,然后点击菜单栏中的“文件”下拉栏,选择“高级保存选项”,将编码方式保存为 “简体中文(GB2312)- 代码页 936” 即可。vs2017 的文件下拉菜单中默认是没有 “高级保存选项” 这一项的,可以自己手工添加。

    2)error msb3073 命令 setlocal :这个就是没有用管理员身份打开 .sln 文件所遇到的问题了,用管理员身份打开即可。

      解决了这两个问题后,再次生成解决方案,应该没问题了。

      最后,在 release 环境下再编译一次。

     

    五、环境变量配置

      在 vs2017 上编译完成后,可以在 C 盘下发现一个 tesseract 安装文件夹,我的是在 C:Program Files esseract:

      可以在 /bin 目录下找到 tesseract.exe 文件,将 C:Program Files esseractin 添加到环境变量 path 中去(如何在 win10 上添加环境变量就不详细说明了,网上有许多教程)。此外,在 /bin 目录下新建两个文件夹 Debug 和 Release,分别将 D: esseract_4.1.0uildinDebug 和 D: esseract_4.1.0uildinRelease 目录下的 .dll 文件复制到所新建的两个文件夹下去;然后将 C:Program Files esseractinDebug 和 C:Program Files esseractinRelease 也添加到环境变量 path 中去,如下:

      此外,新建一个系统变量TESSDATA_PREFIX,变量值为 D: esseract_4.1.0 essdata,这个目录下存放的是 tesseract-ocr 语言包文件,可以在 GitHub 上下载,下载后放到该目录下去即可,下载地址为:https://github.com/tesseract-ocr/tessdata/

      

      配置好这两步后,应该就可以在命令行使用 tesseract 命令了,可以简单测试一下 tesseract 是否安装成功,如下:

     

    六、配置 vs2017 以使用 tesseract

      新建一个项目,在属性管理器,Debug | x64 下面,右键 Microsoft.Cpp.x64.user 选择属性:

     

    1)在 VC++ 目录中:

      选择包含目录,编辑,分别添加这三个目录:

    C:Program Files esseractinclude

    C:Program Files esseractinclude esseract

    C:Program Files esseractincludeleptonica

      这里有个问题是,你在 C:Program Files esseractinclude 下可能并找不到 leptonica 这个目录,没办法,自己动手丰衣足食吧:在 C:Program Files esseractinclude 下新建文件夹 leptonica,然后将 C:Userslenovo.cppanstoragesrc8fa390d7src 目录下的文件全部复制到 C:Program Files esseractincludeleptonica 下即可(不同电脑具体的目录可能会不同,不过都在 C:Userslenovo.cppanstoragesrc 下)

    2)在 VC++ 目录中,选择库目录,编辑,分别添加这三个目录:

    C:Program Files esseractlib

    C:Program Files esseractlibRelease

    C:Program Files esseractlibDebug
      
    同样的,先在 C:Program Files esseractlib 目录下新建两个文件夹 Debug 和 Release,然后将 C:Userslenovo.cppanstoragelibab45fb78Debug 目录下的 .lib 文件全部复制到 C:Program Files esseractlibDebug 目录下;将 C:Userslenovo.cppanstoragelibab45fb78Release 目录下的 .lib 文件全部复制到 C:Program Files esseractlibRelease 目录下。

     

    3)在 链接器 -> 输入 -> 附加依赖项 中,编辑,添加以下两项:

    pvt.cppan.demo.danbloomberg.leptonica-1.76.0.lib
    tesseract41d.lib

      完成后,重启一下电脑,应该就可以在 vs2017 上使用 tesseract 了。  

     

    七、一个使用 tesseract 识别数字的例程

      经过一天的折腾,终于可以使用 tesseract 了,写了一个小程序来试验一下 tesseract 的效果:

    #include <opencv2/opencv.hpp>
    #include <tesseract/baseapi.h>
    #include <leptonica/allheaders.h>
    #include <string>
    
    using namespace std;
    using namespace cv;
    
    PIX* cvtMat2PIX(Mat imgGray);
    
    int main(int argc, char *argv[])
    {
        Mat sourceImage = imread("E:\visual studio\Opencv_Test\Opencv_Test\1.png",cv::IMREAD_GRAYSCALE);
        if (sourceImage.empty()) {
            perror("Failed to load image!
    ");
            exit(EXIT_FAILURE);
        }
    
        Mat binImage;
        threshold(sourceImage,binImage,90,255,cv::THRESH_BINARY_INV);
    
        PIX *pixImage = cvtMat2PIX(binImage);                // 将图片由 Mat 转换成 Pix 格式
    
        // 使用 tesseract 进行数字识别
        const char* lang = "eng";
        string numText;
        tesseract::TessBaseAPI *tess = new tesseract::TessBaseAPI;        // 新建 tesseract 基类
        tess->Init(NULL,lang, tesseract::OEM_LSTM_ONLY);        // 初始化
        tess->SetPageSegMode(tesseract::PSM_AUTO);    // 设置识别模式
        tess->SetImage(pixImage);
        numText = string(tess->GetUTF8Text());
        cout << numText << endl;
    
        waitKey(0);
    }
    
    
    PIX* cvtMat2PIX(Mat imgGray)
    {
        int cols = imgGray.cols;
        int rows = imgGray.rows;
    
        PIX *pixS = pixCreate(cols, rows, 8);
    
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < cols; j++)
                pixSetPixel(pixS, j, i, (l_uint32)imgGray.at<uchar>(i, j));
        return pixS;
    }

       所使用的图片如下:

       识别结果如下:

       效果还算不错。

     

      因为 tesseract 的安装过程是在一周前完成了,故而有些地方记不太清楚,图也不是很多,可能会有一些错误,但是还是希望能对有需要的人有一些帮助。

     

  • 相关阅读:
    HDU 1813 Escape from Tetris
    BZOJ 2276 Temperature
    BZOJ 4499 线性函数
    BZOJ 3131 淘金
    HDU 5738 Eureka
    POJ 2409 Let it Bead
    POJ 1286 Necklace of Beads
    POJ 1696 Space Ant
    Fox And Jumping
    Recover the String
  • 原文地址:https://www.cnblogs.com/tongye/p/10734342.html
Copyright © 2011-2022 走看看