在吐血若干天后终于把整条路走通了,写出来省的后面的童鞋走弯路。
首先,强烈推荐在ubuntu下编译加调用,哪怕你最终的目标是windows也最好先在ubuntu下弄一下,因为真的可以很顺利,按照官网的步骤 一步一步的apt-get,最后make & make install就OK了。
===================我是吃饱了你还要给我塞狗粮的分界线============================
windows10 下编译
1. 下载cmake,添加cmake的bin目录到系统PATH
2. 下载cppan.exe,添加cppan所在的目录到系统PATH(一定要做,我就是这里没做,而是拷贝了一份到cmake的bin目录下完事,结果一直报错,说找不到cppan,整个人疯了),顺便把cppan.exe拷贝一份到cmake.exe所在的bin目录下
3. 下载Tesseract-ocr源码
4. 最新的Tesseract-ocr需要vc2015 or vc2017,所以为了后面各种莫名其妙的错误最好已经安装VS2015或VS2017
5. 关闭你的各种杀毒软件包括什么电脑管家
6. 打开cmd,切换到Tesseract-ocr所在的目录,运行“cppan.exe”,会下载一堆东西耐心等吧,这中间不要断网,win10的defender会询问什么危险 不管它 继续就行
7. 还是在Tesseract-ocr所在的目录下
mkdir build
cd build
cmake ..
别用cmake目录下的那个gui,各种问题!这里最容易出问题的就是提示“找不到*.vcproj模板”或者”cppan找不到之类的”,检查你的vs是不是把vc完整安装了,cmake的时候需要MSBuild.exe,检查你的系统变量;后面的cppan就是要把它所在的目录配进系统变量的PATH中
8. 上面完成后在build目录下会生成一个tesseract.sln,直接用vs打开,在工程中吧cppan-d-b-d移除,否则编译的时候有几千个编码或链接错误,这个工程和我们要用的tesseract.lib没啥关系,然后重新编译会有各种警告不管他 最后就可以得到tesseract400d.lib(c++调用的时候要用到这个文件)和tesseract.exe
9. 把”C:\Users\XXX.cppan\storage\bin\9dbf6c7c\Debug”下的所有.dll文件拷贝到tesseract.exe所在目录,然后找个简单点的jpg文件也放在该目录下,运行”tesseract.exe 1.jpg 1_1”,不报错的话会在该目录下生成一个 1_1.txt,这里就是jpg图片里的文字,如果报错了 恭喜你中奖了,那就看看错误提示吧,我是遇到了一个源码的bug,搞N久,现在最新版本里的这个bug已经修改过了。
10. 至此编译阶段已经全部搞定,在windows下走到这一步的都是胜利。再重申一遍 哥们还是先在ubuntu下编译吧,你会发现windows严重阻碍了我们积极进取的心
================我是“谁给我塞狗粮我就拉黑谁”的分割线========================
c++/python 调用Tesseract-ocr API
这里windows下还有个坑,你在上面编译的时候需要留意下你编译出来的是x64还是win32,在c++下还好说,如果调用的时候提示平台神马的,你改下目标平台适配*.lib就可以了,但是在python下没法改啊,所以……如果你编译的是win32,那你需要安装32位的python,否则64位的python。不要问我我是怎么知道的,因为我写过python调用dll的项目啊(我怎么可能告诉你这里又被坑了!!!!)
c++ 调用示例:
1. 在Tesseract-ocr目录下新建一个include目录,然后进入再新建两个目录”leptonica”和”tesseract”
把Tesseract-ocr\src目录下的所有文件夹都拷贝到新建的tesseract文件夹下,其实只用到了其中几个,不想找太多直接拷贝吧;在github下载leptonica-1.76.0,将leptonica-1.76.0\src下的所有文件拷贝到上面新建的leptonica目录下
2. 同样在Tesseract-ocr目录下新建一个lib目录,把C:\Users\XXX.cppan\storage\lib\9dbf6c7c\Debug下的所有lib文件拷贝过来,其实这样做就是为了便于管理和在项目中引入
3. 先建环境变量“TESSDATA_PREFIX”,值是Tesseract-ocr目录下的tessdata文件夹路径,tessdata文件夹下存放训练好的语言模型‘eng.traineddata’
4. 新建一个vc控制台工程,右键项目属性,”VC++目录”->”包含目录”,把第一步建立的文件夹包含进去;”库目录”把第二不建的文件夹填入;”连接器”->”输入”->”编辑” 填入
pvt.cppan.demo.danbloomberg.leptonica-1.76.0.lib
tesseract40d.lib
这两个文件名
在主函数中写测试代码:
#include "stdafx.h"
#include <leptonica\allheaders.h>
#include <tesseract\api\baseapi.h>
using namespace tesseract;
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("1.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;
}
编译运行,这个世界终于安静了。有可能会出现连接错误,仔细检查上面的工程配置!
python调用示例:
这里说的不是简单的在python中运行“tesseract.exe”后面加参数,而是和C++一样调用DLL中的API,网上绝大部分的都是直接运行tesseract.exe,即便是安装pytesseract这个包,最终还是调用的.exe文件!如果你之前写过python调用dll文件,应该对这个过程很熟悉,利用ctypes.cdll.LoadLibrary(libname)来导入DLL文件,然后做函数声明,最后在代码中调用,我们刚刚已经生成了tesseract.lib,所以完全可以自己利用ctypes.cdll.LoadLibrary(libname)来做这个事情,但是你弄过就会明白声明的时候会有各种问题,主要集中在C的指针和各种类型的变量对应的python类型,还好已经有人帮我们做完这个事情了,先
pip install pyocr
找到C:\Python36\Lib\site-packages\pyocr\libtesseract\tesseract_raw.py,打开后把导入error这一行改成:
sys.path.append('../')
from pyocr.error import TesseractError
保存后退出
测试代码:
from pyocr.libtesseract import tesseract_raw
from PIL import Image
img = Image.open('1.jpg')
handle = tesseract_raw.init(lang='eng')
tesseract_raw.set_image(handle, img)
text = tesseract_raw.get_utf8_text(handle)
print(text)
tesseract_raw.cleanup(handle)
这里的代码和上面的C++代码完全一一对应。切记,你的dll文件一定要和python的平台一致,要么都是win32要么都是x64,否则在tesseract_raw.init(lang=’eng’)的时候会报错!
==============================我是可爱的结束语================================
至此,路已经全部打通。所有tesseract导出的C-API都在..\src\api\capi.h中声明,所以需要在源码中添加特殊功能的话在这里声明下导出即可,然后在tesseract_raw.py中对导出的函数进行声明和封装,最后在自己的代码中调用即可。这里都是源码级别的修改和调用,灵活性很大,可以满足客官的各种需求 哈哈!后面再写一篇CTPN的,加上这篇,整个OCR的路就全通了~