tesseract 是一个开源的OCR (Optical Character Recognition , 光学字符识别) 引擎,本文就介绍一下本身在编译 tesseract4.1.0时遇到的一些坑,但愿能给你们带来一些帮助。git
1、下载 tesseractgithub
tesseract 是一个开源项目,能够在 GitHub 上下载源码:https://github.com/tesseract-ocr/tesseract/releases/ 小程序
固然,也能够下载安装版的:https://github.com/UB-Mannheim/tesseract/wiki api
安装版的下载完后直接安装,而后配置环境变量(这个后面会讲到)便可使用。这个方法笔者也尝试过,可是很遗憾,没能在 vs 上找到相关的库文件,也就是不能在 vs 中调用 tesseract 相关的函数方法,只能在控制台上使用,这就比较蛋疼了,暂时在网上也没找到相关的方法,因此只能下个源码包本身编译配置了,折腾了一天才搞定,不得不吐槽一下在 Windows 上想本身编译一个东西真是麻烦。函数
2、所须要用到的工具工具
在 Windows 上编译 tesseract 主要须要用到两个工具:cmake和 cppan。测试
2.1 cmakeui
cmake 是一个跨平台的编译工具 ,可使用 cmake 在 Windows 上将源码编译成你想要的文件(好比说电脑上装了 visual studio,那么就能够生成 .sln 文件),在 Linux 上使用 cmake 的话,则能够生成 makefile 文件,能够说功能很是强大了。编码
Windows 上安装 cmake 很简单,直接下载可安装文件后一键安装就行:https://cmake.org/download/spa
须要下载哪一个是本身系统而定,笔者下载的是cmake-3.14.2-win64-x64.msi ,这个是能够直接安装的。安装完后,记得将 cmake 安装目录下的 /bin 目录添加到 path 环境变量中去(本人的相应目录是 D:\Program Files\CMake\bin )。配置完环境变量后,就能够在命令行使用 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 命令了。
3、从源代码编译安装 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 便可。
4、在 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 环境下再编译一次。
5、环境变量配置
在 vs2017 上编译完成后,能够在 C 盘下发现一个 tesseract 安装文件夹,个人是在 C:\Program Files\tesseract:
能够在 /bin 目录下找到 tesseract.exe 文件,将 C:\Program Files\tesseract\bin 添加到环境变量 path 中去(如何在 win10 上添加环境变量就不详细说明了,网上有许多教程)。此外,在 /bin 目录下新建两个文件夹 Debug 和 Release,分别将 D:\tesseract_4.1.0\build\bin\Debug 和 D:\tesseract_4.1.0\build\bin\Release 目录下的 .dll 文件复制到所新建的两个文件夹下去;而后将 C:\Program Files\tesseract\bin\Debug 和 C:\Program Files\tesseract\bin\Release 也添加到环境变量 path 中去,以下:
此外,新建一个系统变量TESSDATA_PREFIX,变量值为 D:\tesseract_4.1.0\tessdata,这个目录下存放的是 tesseract-ocr 语言包文件,能够在 GitHub 上下载,下载后放到该目录下去便可,下载地址为:https://github.com/tesseract-ocr/tessdata/
配置好这两步后,应该就能够在命令行使用 tesseract 命令了,能够简单测试一下 tesseract 是否安装成功,以下:
6、配置 vs2017 以使用 tesseract
新建一个项目,在属性管理器,Debug | x64 下面,右键 Microsoft.Cpp.x64.user 选择属性:
1)在 VC++ 目录中:
选择包含目录,编辑,分别添加这三个目录:
C:\Program Files\tesseract\include
C:\Program Files\tesseract\include\tesseract
C:\Program Files\tesseract\include\leptonica
这里有个问题是,你在 C:\Program Files\tesseract\include 下可能并找不到 leptonica 这个目录,没办法,本身动手丰衣足食吧:在 C:\Program Files\tesseract\include 下新建文件夹 leptonica,而后将 C:\Users\lenovo\.cppan\storage\src\8f\a3\90d7\src 目录下的文件所有复制到 C:\Program Files\tesseract\include\leptonica 下便可(不一样电脑具体的目录可能会不一样,不过都在 C:\Users\lenovo\.cppan\storage\src\ 下)
2)在 VC++ 目录中,选择库目录,编辑,分别添加这三个目录:
C:\Program Files\tesseract\lib
C:\Program Files\tesseract\lib\Release
C:\Program Files\tesseract\lib\Debug
一样的,先在 C:\Program Files\tesseract\lib 目录下新建两个文件夹 Debug 和 Release,而后将 C:\Users\lenovo\.cppan\storage\lib\ab45fb78\Debug 目录下的 .lib 文件所有复制到 C:\Program Files\tesseract\lib\Debug 目录下;将 C:\Users\lenovo\.cppan\storage\lib\ab45fb78\Release 目录下的 .lib 文件所有复制到 C:\Program Files\tesseract\lib\Release 目录下。
3)在 连接器 -> 输入 -> 附加依赖项 中,编辑,添加如下两项:
pvt.cppan.demo.danbloomberg.leptonica-1.76.0.lib
tesseract41d.lib
完成后,重启一下电脑,应该就能够在 vs2017 上使用 tesseract 了。
7、一个使用 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!\n"); 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 的安装过程是在一周前完成了,故而有些地方记不太清楚,图也不是不少,可能会有一些错误,可是仍是但愿能对有须要的人有一些帮助。