1. 程式人生 > >Tesseract4配置與示例

Tesseract4配置與示例

接上一篇部落格:Tesseract4編譯,

       上次編譯Tesseract4.0後,在“C:/Programe Files(x86)/tesseract/”目錄下生成了目錄"include","lib","bin",這些就是我們程式設計需要的標頭檔案和庫。沒配置之前,感覺挺簡單的,無非是一些標頭檔案和庫,和opencv配置差不多的。其實一大波坑在等著我.......

重點在此,如圖:

前面2步整理lib時沒問題。

dll感覺不需要那麼多,後面再說

在整理標頭檔案時麻煩來了,按照這個目錄結構一層層去找,竟然沒有“2a”資料夾...........

難道我的編譯有問題?應該不會啊,cmake成功,VS裡也編譯成功,沒道理啊......

機智如我,我在"C:\Users\username\.cppan\storage\obj"目錄下用windows查詢功能搜尋"endianness.h",找到了。

然後在“C:\Users\username\.cppan\storage\src”目錄下搜尋“src”,悲劇了,找到的還是這個父目錄

不知道leptonica的標頭檔案是啥這可咋辦?

難道真的是我沒編譯好?

迫於無奈,又重新編譯了一遍,花了好幾個小時,再找標頭檔案,還是沒找到.......

沒轍了,看看別人編譯好的標頭檔案和庫是哪些吧,又是一頓網路搜尋,找到了一篇似乎靠譜的部落格:

按照這位老鐵提供的網址下載了他的標頭檔案和庫,他的檔案結構如下:

彷彿看到了希望,馬上去“C:\Users\username\.cppan\storage\src”下搜尋“allheaders.h”

驚喜的是:搜到了!這傢伙躲在這個目錄下:

然後把這個“src”整個目錄拷過來,

還有個config_auto.h這個標頭檔案,直接在“users/使用者名稱/.cppan/”目錄下搜“config_auto.h”,

也搜到了,這傢伙躲在此處:

把config_auto.h也copy過來。

做到這裡,想想也是夠坑的,應該是cppan版本不同,然後下載這些檔案後解壓路徑不一樣,我們按前輩提供的

路徑去找標頭檔案肯定是找不到了。各位前輩說一下主要標頭檔案是什麼不就好了嘛。吐血。。。。

我下載了英文和中文簡體,建個"tessdata"資料夾存放字型檔

給大家展示一下我整理的檔案結構:(目前不知道動態庫是哪些,在執行程式時再找)

標頭檔案結構如下:

leptonica標頭檔案很多,列一部分,注意兩個重要標頭檔案(畫箭頭的):

tesseract標頭檔案也有很多,也列一部分,注意有個重要檔案“capi.h”:

lib庫全部copy過來:

字型檔在下載原始碼的時候可以看到,按需下載後放到新建資料夾"tessdata"下:

找的官網示例程式碼不能執行,編譯一百多個錯誤,錯誤原因只有一個:沒包含“windows.h”標頭檔案。吐血。。。

福利來了,現貼出我將示例程式碼略作修改後的程式碼(程式碼中路徑均為相對路徑,沒用環境變數):

#include<iostream>
#include <stdio.h>
#include<windows.h>
#include "leptonica/allheaders.h"
#include "tesseract/capi.h"
using namespace std;


void die(const char *errstr) {
	fputs(errstr, stderr);
	exit(1);
}


void ConvertUtf8ToGBK(char **amp, char *strUtf8)  //轉碼
{
	int len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8, -1, NULL, 0);
	unsigned short * wszGBK = new unsigned short[len + 1];
	memset(wszGBK, 0, len * 2 + 2);
	MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8, -1, (LPWSTR)wszGBK, len);
	len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
	//char *szGBK=new char[len + 1]; 
	*amp = new char[len + 1];
	memset(*amp, 0, len + 1);
	WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszGBK, -1, *amp, len, NULL, NULL);
}

int main(int argc, char *argv[]) {
	TessBaseAPI *handle;
	PIX *img;
	char *text = NULL;
	//讀取圖片,原影象的路徑 
	if ((img = pixRead("test.jpg")) == NULL)
		die("Error reading image\n");

	handle = TessBaseAPICreate();
	//載入字型檔及設定語言
	if (TessBaseAPIInit3(handle,"../tessdata", "eng+chi_sim") != 0)
		die("Error initialising tesseract\n");

	//設定圖片及識別
	TessBaseAPISetImage2(handle, img); 
	if (TessBaseAPIRecognize(handle, NULL) != 0)
		die("Error in Tesseract recognition\n");

	if ((text = TessBaseAPIGetUTF8Text(handle)) == NULL)
		die("Error getting text\n");

	char *pResult = NULL;
	ConvertUtf8ToGBK(&pResult, text); //對結果轉碼
	cout << pResult << endl;   //輸出OCR識別的文字資訊
	delete pResult;

	system("pause");
	TessDeleteText(text);
	TessBaseAPIEnd(handle);
	TessBaseAPIDelete(handle);
	pixDestroy(&img);

	return 0;
}

標頭檔案和lib庫配置不用說了,和opencv配置差不多

按需為字型檔設定環境變數TESSDATA_PREFIX(本示例用的相對路徑未用環境變數),值為字型檔檔案的目錄。

本示例工程 Tess4Test 檔案結構如下:(tessdata為字型檔檔案)

專案配置如下:

此時由於還不知道有哪些動態庫,編譯執行後會有錯誤,如圖:

根據這些錯誤提示去搜相應的dll檔案,

tesseract40(d).dll在“C:\Program Files (x86)\tesseract\bin”目錄下搜尋到

其它的dll在“C:\Users\使用者名稱\.cppan\storage\bin”目錄下搜尋到

一共9個dll放到Debug/Release資料夾下(或者系統目錄):

上一張測試圖片:

執行後輸出結果:

這張中、英文、數字混合的圖片識別率在90%以上,還算可以了

到此,配置成功!

下載後無需配置任何環境變數,標頭檔案、庫、字型檔都已打包好,只要你電腦裝有VS2015就可以正常編譯、除錯、執行。

*****************  以上為個人吐血整理,堪稱全網最詳細!如有轉載,請標明出處! *******************

另外,目前在網路上搜索Tesseract4的學習資料基本沒有,看它的原始碼標頭檔案中的函式宣告,

這幾百個函式連個註釋都沒有,這將又是一個大坑,探索之旅還很漫長。。。。

網友如有Tesseract4的學習資料,還望能發個連結一起互相學習。