在C++中使用tesseract4.0

在上一章中我们从源码生成了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处理下图片,识别率可以接近百分百。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章