C++在Tesseract-OCR中使用自己训练的字库进行字体识别

时间:2022-04-22 08:59:04

1.在VS中配置好Tesseract-OCR的使用环境,配置的方法跟Opencv类似,可自行百度!相关配置截图如下:

C++在Tesseract-OCR中使用自己训练的字库进行字体识别

C++在Tesseract-OCR中使用自己训练的字库进行字体识别

2.将训练好的字库拷贝到Tesseract-OCR的字库文件夹tessdata中,如下图,我训练的字库名为:myself

C++在Tesseract-OCR中使用自己训练的字库进行字体识别

3.先使用命令行进行调用测试自己训练的字库:

C++在Tesseract-OCR中使用自己训练的字库进行字体识别

C++在Tesseract-OCR中使用自己训练的字库进行字体识别

4.C++中进行调用Tesseract-OCR识别,代码实现如下:

//写本地日志,在原来的基础上追加内容!
void savefile(CString  filename, char * info)
{
	//将内容写至本地保存起来。。。
	int j = 0;
	char ch[8000] = { 0 };
	SYSTEMTIME sys;
	GetLocalTime(&sys);
	j = sprintf(ch, "%s", info);
	j += sprintf(ch + j, "\r\n\r\ntime:%02d/%02d %02d:%02d:%02d.%03d \r\n", sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds);
	CFile file;
	file.Open(filename, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate, NULL);
	file.SeekToEnd();
	//file.Write(info, strlen(info));
	file.Write(ch, j);
	file.Close();
}

TessBaseAPI ocr;
char* identifyText(char* language = "myself")
{
	remove("D:\\tain.txt");
	ocr.Init(NULL, language, OEM_DEFAULT);
	ocr.SetPageSegMode(PSM_AUTO);//设置自动进行版面分析
	STRING text_out;
	if (!ocr.ProcessPages("D:\\t1.jpg", NULL, 0, &text_out))
	{
		return NULL;
	}
	printf(text_out.string());
	char * ch = (char *)text_out.string();
	savefile("D:\\tain.txt", ch);
	return ch;
}
识别结果:

C++在Tesseract-OCR中使用自己训练的字库进行字体识别

存在问题:
1.识别的出来的内容不知道怎么分行,图片中的内容原本是3行,现在识别出来是在一行的!望懂得怎么解决的大神指教;
2.对于比用于做字库训练图片大的图片识别效果的时候效果不是很理想,不懂是不是因为拿来做训练字库的图片数量太少了,我就用了几张而已!