作为一个优秀的文字识别(OCR)库,Tesseract最早并非开源软件,它是HP实验室在1985-1994年开发的专属软件,直到2005年,HP及内华达大学拉斯维加斯分校以开源的形式发布,然后由Google从2006年开始赞助Tesseract的开发作业。 Tesseract第4版增加了以LTSM为基础的OCR引擎及许多模型,使其支持达116种语言、37种文字(Script)。历经2年多的开发测试后,Tesseract第5版于2021年发布。
Tesseract分为两种发行,一种是已经编译好之后发行的程序,可以通过Tesseract installer for Windows直接下载安装, 下载地址:
https://github.com/UB-Mannheim/tesseract/wiki
另一个分支是为开发者准备的开源库,通过它可以将Tesseract嵌入到自己的程序中去,本文讲的主要是后者。
安装过程主要分为4个步骤:
下载地址:
https://www.msys2.org/
(下载完毕后无脑下一步即可,注意在安装到50%的时候会卡顿很成一段时间,耐心等待不要中断它)
安装完毕后,默认在 c:\msys64 里,打开这个目录,会发现很多启动文件,我们选:mingw64.exe 进入环境。
进入MSYS2之后第一件事情就是更新它的 pacman 包管理器,输入:
$ pacman -Syu
(期间可能会要求重启Shell,被中断之后别忘了进来还得输入一次 pacman -Syu
)
更新完毕后,开始安装编译环境(主要是Mingw C++工具链):
$ pacman -S base-devel msys2-devel mingw-w64-x86_64-toolchain git
然后开始安装各种 Tesseract 所需要的依赖:
$ pacman -S mingw-w64-x86_64-asciidoc mingw-w64-x86_64-cairo mingw-w64-x86_64-curl mingw-w64-x86_64-icu mingw-w64-x86_64-leptonica mingw-w64-x86_64-libarchive mingw-w64-x86_64-pango mingw-w64-x86_64-zlib mingw-w64-x86_64-autotools mingw-w64-x86_64-cmake
$ cd ~
(回到家目录)
$ git clone https://github.com/tesseract-ocr/tesseract tesseract
(将源代码从github下克隆到本地)
$ cd tesseract
$ mkdir build && cd build
$ cmake .. -G"MinGW Makefiles" -DSW_BUILD=0 -DCMAKE_INSTALL_PREFIX=/usr/local
(-DSW_BUILD=0 表示不用sw构建程序,Sw即Software Network也是一个开源安装器,我试了在国内不好使, -DCMAKE_INSTALL_PREFIX=/usr/local 表示将程序安装到/usr/local)
因为提前安装了所需的所有依赖,因此整个编译过程非常平和,不会跳出Error甚至也没有Warning,如果你卡在这一步,请仔细检查上面的依赖安装项是否安装成功?
编译完成后,用以下命令进行安装:
$ cmake --build . --config Release --target install
安装好之后,文件保存在:
头文件:
/usr/local/include/tesseract
[物理路径:C:\msys64\usr\local\include\tesseract
]
库文件:
/usr/local/lib
[物理路径:C:\msys64\usr\local\lib
]
另外,Tesseract还用到了另一个开源库叫做Leptonica,这个库是我们之前用 pacman 安装的,默认保存在:
头:C:\msys64\mingw64\include\leptonica
库:C:\msys64\mingw64\lib\libleptonica.a
(因为其他的非C++语言引用 Tesseract 的时候有可能会需要这两个路径,因此我一并告知。)
最后,我们还需要为 Tesseract 准备训练数据,“eng(英文)” 的下载地址是:
https://github.com/tesseract-ocr/tessdata/blob/main/eng.traineddata
文件有22MB大,下载后拷贝到 /usr/local/share/tessdata
(即 C:\msys64\usr\local\share\tessdata
)
完成之后,设置训练数据路径环境变量:
$ export TESSDATA_PREFIX=/usr/local/share/tessdata
(注意这个环境变量重启后会失效,可以把它放进 .bashrc 里以永久生效)
这些工作都做完了之后,就可以进入下一步“测试”阶段了。
$ cd ~
(回到家目录)
$ mkdir test && cd test
$ nano test.cpp
(创建测试程序,内容如下)
#include
#include
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("test.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 api;
delete [] outText;
pixDestroy(&image);
return 0;
}
这是 Tesseract 官方文档的标准测试程序,在编译之前,我们还得准备一张图,
打开画板,选择文字工具,随便输入点文字(注意得是英文),比如:Hello World! 存盘,注意要保存为 .tif 格式。把这个文件( 以 test.tif 为例 )拷贝到家目录的/test子目录下。
用下面这个命令进行编译:
g++ test.cpp `pkg-config --libs lept tesseract` -o test
(这一步最容易显示一堆 undefined reference to XXX,仔细检查前述所有过程,如果严格按照教程一步一步走的话是不应该出现这个提示的)
如果一切正常,输入:
$ test.exe
程序显示:
OCR output:
Hello World!
恭喜成功!
Tesseract项目地址:
https://github.com/tesseract-ocr/tesseract
参考资料:
https://tesseract-ocr.github.io/tessdoc/Compiling.html#windows
https://tesseract-ocr.github.io/tessdoc/Examples_C++.html
https://medium.com/building-a-simple-text-correction-tool/basic-ocr-with-tesseract-and-opencv-34fae6ab3400
https://packages.msys2.org