在上一章中我们从源码生成了tesseract4.0的执行程序exe以及所有的动态库依赖,这个exe程序其实就和你在网上下载的tesseract安装包是一样的,只不过自己编译的执行程序可以在vs2015环境中运行。
我们把E:\tesseract-4.0.0\build_x86\bin\Release这个目录添加到环境变量里去,这个目录是tesseract.exe所在的目录。
将tesseract.exe所在目录添加到环境变量path里
tesseract4.0的语言库tessdata也需要添加到环境变量里,如下为语言库
在系统环境变量里设置语言库的环境变量
变量名为:TESSDATA_PREFIX
变量值为tessdata目录:E:\tesseract-4.0.0\tessdata
然后我们可以在控制台测试已经可以成功使用
测试tesseract
测试语言库tessdata
tesseract --list-langs
接下来就可以在vs2015中使用tesseract了
.h头文件为
E:\tesseract-4.0.0\build_x86\api
E:\tesseract-4.0.0\src\wordrec
E:\tesseract-4.0.0\src\vs2010
E:\tesseract-4.0.0\src\viewer
E:\tesseract-4.0.0\src\training
E:\tesseract-4.0.0\src\textord
E:\tesseract-4.0.0\src\opencl
E:\tesseract-4.0.0\src\lstm
E:\tesseract-4.0.0\src\cutil
E:\tesseract-4.0.0\src\classify
E:\tesseract-4.0.0\src\ccutil
E:\tesseract-4.0.0\src\ccstruct
E:\tesseract-4.0.0\src\ccmain
E:\tesseract-4.0.0\src\arch
E:\tesseract-4.0.0\src\api
lib文件为:tesseract40.lib
动态库dll由于已经添加到环境变量里,所以不用管。
一下为使用实例:
#include<iostream>
#include<string.h>
#include<baseapi.h>
#include <codecvt>
#include<opencv2/opencv.hpp>
#include<fstream>
using namespace std;
using namespace cv;
std::wstring to_wchar_t(std::string str);
std::string to_utf8(std::wstring wstr);
int main()
{
string outText;
string imgPath = "3.jpg";
//定义tesseract
tesseract::TessBaseAPI *ocr = new tesseract::TessBaseAPI();
//把tessdata拷贝到exe的所在目录,或者设置TESSDATA_PREFIX环境变量
ocr->Init("./tessdata", "chi_sim+eng+chi_sim_vert", tesseract::OEM_DEFAULT);
ocr->SetPageSegMode(tesseract::PSM_AUTO);
//使用OpenCV读取图片
Mat image = imread(imgPath,1);
//使用OCR识别图片
ocr->SetImage(image.data, image.cols, image.rows, 3, image.step);
//ocr获取的数据直接就是utf8格式的,存入文本文件也是utf8格式
char* u8_array = ocr->GetUTF8Text();
string u8_str= u8_array;
ocr->End();
//utf8转Unicode
std::wstring w_str = to_wchar_t(u8_str);
//unicode转ANSI
std::wstring_convert<codecvt<wchar_t, char, mbstate_t>> converter(new codecvt<wchar_t, char, mbstate_t>("CHS"));
string ansi_str = converter.to_bytes(w_str);
cout << ansi_str << endl;
system("pause");
return 0;
}
std::wstring to_wchar_t(std::string str)
{
return std::wstring_convert< std::codecvt_utf8<wchar_t>, wchar_t >{}.from_bytes(str);
}
std::string to_utf8(std::wstring wstr)
{
return std::wstring_convert< std::codecvt_utf8<wchar_t>, wchar_t >{}.to_bytes(wstr);
}
下图为程序执行结果,可以看出,识别率非常高。其实tesseract要想提高识别率,应该从图片源头做起,利用OpenCV处理下图片,识别率可以接近百分百。