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的學習資料,還望能發個連結一起互相學習。