tesseract 4.0在windows10 MSVC 15 2017下编译

第一步,准备工作

包括安装Git,CMake以及下载cppan命令工具、从git上获取tesseract源码



第二步,生成MSVC解决方案

本文为64位编译器(32直接cmake ..即可),编译完成后,在build目录下出现tesseract.sln,即解决方案文件

VS2017为15 2017



第三步,MSVC中编译源码

对解决方案执行生成解决方案过程中,会遇到以下问题

1、C2001、C2059、C1057、C2146之类的错误,提示位于项目cppan中,此类错误为对应文件的编码格式问题,这些文件中存在字符值(字符,字符串)参数,由于中文系统的编码方式与英文不一样,所以导致错误。打开对应的文件,设置 ”高级保存选项“为Unicode(UTF-8带签名)格式即可,有个文件例外,即tesseract\ccmain\equationdetect.cpp,需要保存为简体中文(GB2312-80)

注:一般是这几个文件:gbookmarkfile.c,gregex.c,gkeyfile.c,gfileutils.c,gconvert.c,pango-language-sample-table.h,equationdetect.cpp。

        找不到高级保存选项的可参考高级保存选项设置

2、错误为C1083,dirent.h文件找不到,可以直接从 Github: tronkko/dirent 获得这个文件。

dirent.h 是一个来自于 C POSIX library 的文件,通常被包含在 GCC (Cross-platform)、MinGW (Microsoft Windows)、Borland C++ 这些编译器中,但是 MSVC 并不包含此文件。 

通过http://kinolien.github.io/gitzip/,输入上面github上dirent.h的url,直接下载该文件,然后复制到Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\include目录中。


第四步,安装tesseract库

右键单击CMake中的INSTALL,选择仅用于项目菜单中的仅生成INSTALL,即可在系统盘中安装库,安装位置一般为C:\Program Files\tesseract

注:此步骤一定要确保VS是以管理员权限运行的,否则会报错,因为在系统盘中创建文件是需要管理员权限的。


第五步,tesseract库的配置

随便打开一个项目,如果没有,就新建一个。打开属性管理器,对编译器进行配置,如x64 debug模式,右击.user项,打开配置面板。

1、找到VC++目录项,将前面安装的tesseract相应目录进行包含,include目录和lib目录

注:由于tesseract库需要用到leptonica库,还需要在include目录中添加leptonica源码src中的所有头文件。(Ensure that the development headers for Leptonica are installed before compiling Tesseract.

2、配置链接器的输入依赖项(如果不配置,程序就会报无法解析的外部命令错误),添加pvt.cppan.demo.danbloomberg.leptonica-1.75.1.lib(需要先从.cppan的storage中找到并复制到tesseract安装目录的lib目录中)和tesseract400d.lib。

3、.dll文件,将之前编译的tesseract的build文件夹中bin文件夹下的.dll文件全部复制到tesseract安装目录下的bin文件夹中,即C:\Program Files\tesseract\bin,然后设置环境变量,在Path中添加这个目录,如果不配置环境变量,程序能够编译成功,但在运行时会报相应的.dll文件丢失的错误。



附上测试代码:

如果能成功编译并运行,说明基本成功。

注:unichar.h文件中UTF32ToUTF8方法的返回值为string类型,由于string为std名称空间下的,该声明中没有加上名称空间作用域,会报错无法识别的标识符,根据错误定位到该文件,在string前加上std::即可,这个与前面tesseract库的编译无关。

另外,如果要想正确运行,还需要tesseract语言包的支持,并添加一个环境变量TESSDATA_PREFIX指向tessdata目录。

#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>

int main()
{
    char *outText;

    tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
    // Initialize tesseract-ocr with English, without specifying tessdata path
    if (api->Init(NULL, "eng")) {
        fprintf(stderr, "Could not initialize tesseract.\n");
        exit(1);
    }

    // Open input image with leptonica library
    Pix *image = pixRead("/usr/src/tesseract/testing/phototest.tif");
    api->SetImage(image);
    // Get OCR result
    outText = api->GetUTF8Text();
    printf("OCR output:\n%s", outText);

    // Destroy used object and release memory
    api->End();
    delete [] outText;
    pixDestroy(&image);

    return 0;
}




猜你喜欢

转载自blog.csdn.net/pragma_g/article/details/79272271