下載Tesseract-OCR安裝包,地址爲:java
https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w32-setup-v4.0.0-beta.1.20180608.exegit
參考連接:https://github.com/tesseract-ocr/tesseractgithub
雙擊安裝,語言庫部分選擇math,chinese simplified.api
將Tesseract-OCR安裝目錄加入環境變量,緩存
變量名TESSDATA_PREFIXide
變量值F:\Program Files (x86)\Tesseract-OCR\tessdata函數
將如下圖片保存爲test.jpg,而後放在E盤根目錄下post
在cmd窗口中執行 tesseract test.jpg test.txt –l chi_sim+eng(chi_sim是中文識別包,equ是數學公式包,eng是英文包),便可將圖片中的文字識別出來,識別結果以下:測試
語言庫地址爲:https://github.com/tesseract-ocr/tessdata字體
將所須要的語言庫下載下來,放在F:\Program Files (x86)\Tesseract-OCR\tessdata目錄下
採用jTessBoxEditor 生成本身的字庫。
首先須要安裝java虛擬機10.0.2+jTessBoxEditor。
jTessBoxEditor下載地址:
https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/
這裏咱們下載jTessBoxEditorFX-2.0.1.zip版本,帶FX的版本,才支持中文字符編輯。
字庫製做具體步驟:
1.環境變量設置
解壓jTessBoxEditorFX-2.0.1.zip,發現有tesseract-ocr文件夾,裏面有tesseract.exe軟件。所以咱們要將系統中以前安裝的tesseract軟件卸載,將環境變量定位到當前tesseract-ocr所在文件夾。
此外還須要添加環境變量:TESSDATA_PREFIX,變量值指向
..\jTessBoxEditorFX\tesseract-ocr\tessdata
2.圖片準備
咱們但願製做一個數字字庫,可以識別如下字體的數字。
咱們將上面圖片中的每一行保存成一個小圖片。而後打開而後用java虛擬機打開jTessBoxEditorFX.jar。
選擇 Tools -> Merge TIFF,打開對話框,選擇訓練樣本所在文件夾,並選中全部要參與訓練的樣本圖片,注意對話框中「文件類型」的選取:
點擊 「打開」 以後彈出保存對話框,仍是選擇在當前路徑下保存,文件命名爲 「num_my.font.exp0.tif」 ,格式只有一種 「TIFF」 可選:
點擊 「保存」 以後在指定路徑下生成全部樣本的 「合併」 圖片 chi_my.font.exp0.tif。
3.使用tesseract生成.box文件
在上一步驟中生成的 「num_my.font.exp0.tif」 文件所在路徑下打開命令行程序,執行如下命名:
tesseract num_my.font.exp0.tif num_my.font.exp0 –l eng batch.nochop makebox
執行後,在當前路徑下生成num_my.font.exp0.box文件。
使用jTessBoxEditor調整.box訓練文件
「.box」 文件中記錄了每一個字符在圖片上的位置以及識別出的內容,訓練以前須要使用jTessBoxEditor調整字符的位置和內容。
打開 jTessBoxEditor ,點擊 Box Editor -> Open ,打開步驟2中生成的 「num_my.font.exp0.tif」 ,會自動關聯到 「num_my.font.exp0.box」 文件:
右上角紅色方框內分別能夠調整字符的內容、位置、寬高等,不帶 「FX」版本的jTessBoxEditor還能夠直接在方框內輸入具體的數值,但不支持中文字符!…… 帶 「FX」 版本的jTessBoxEditor支持中文字符,可是居然不能夠在方框內直接輸入數值,須要一下一下點擊方框右邊的三角框!
接下來咱們須要對識別不對的地方進行調整。
好比圖片中還在數字」8」的位置,但它識別成「9」了,所以這裏咱們須要點擊Merge進行處理。同理,有的地方須要點擊spilit,insert進行處理。
上圖調整以後以下:
依次將5張所須要訓練的圖片都進行適當的調整。
調整全部樣本後點擊 File -> Save as 另存爲調整後的 「.box」 文件或Ctrl + S 原地保存。這裏咱們原地保存。
4.使用echo命令建立字體特徵文件
在cmd窗口中執行echo num_my 0 0 0 0 0>font_properties
執行完成以後,在當前文件夾下生成font_properties文件
也能夠手動在該文件夾下創建一個名爲 「font_properties」 的文件,這個文件沒有後綴名稱,輸入內容 「font 0 0 0 0 0」 , 表示字體 font 的粗體、傾斜等共計5個屬性全都設置爲0
注意 : 這裏輸入的 「font」 名稱必須與 「chi_my.font.exp0.box」 中兩個點號之間的 「font」 名稱保持一致。
在tesseract訓練語言包的過程當中,jTessBoxEditor的做用就是調整(位置和內容)tesseract生成的 「.box」文件,這個文件中列出了每一個字符在圖片上的位置以及內容。
5.使用tesseract生成num_my.font.exp0.tr訓練文件
在終端上執行如下命令:
tesseract num_my.font.exp0.tif num_my.font.exp0 nobatch box.train
執行後在當前文件夾下生成 num_my.font.exp0.tr訓練文件。
6.生成字符集文件
在終端上執行如下命令:
執行以後在當前文件夾下生成 「unicharset」 文件。
7.生成數據字典
在終端上依次執行如下兩條命令:
mftraining -F font_properties -U unicharset -O num_my.unicharset num_my.font.exp0.tr
cntraining num_my.font.expo.tr
會在當前目錄下生成 4 個文件(inttemp、pffmtable、normproto、shapetable),須要手動修更名稱,這裏咱們修改爲num_my.inttemp、num_my.pffmtable、num_my.normproto、num_my.shapetable。
8.合併數據文件
在cmd窗口中執行如下命令,生成num_my.traneddata語言包文件
combine_tessdata num_my.
將num_my.traneddata文件放到\jTessBoxEditorFX\tesseract-ocr\tessdata目錄下。
9.驗證訓練生成的語言包
在cmd窗口中執行如下命令:
Tesseract test2.png result –l num_my –psm 7
而後打開result.txt.便可看到識別結果,下圖左邊是test2.png圖片,又圖是識別結果。
參考連接:
https://blog.csdn.net/dcrmg/article/details/78233459?locationNum=7&fps=1
下載leptonica源碼:http://www.leptonica.com/source/leptonica-1.76.0.tar.gz
安裝cmake,打開cmake-gui,按下圖進行配置
先點擊configure,出現紅色部分GIF,JPEG,TIFF,ZLIB都是leptonica所須要的圖片識別庫,這裏咱們無論他,再次點擊Configure按鈕進行編譯就行了。
在generate生成的目錄中,打開leptonica.sln
點擊生成,默認生成的是dll文件,這裏須要修改下,生成.lib文件
參考連接:https://blog.csdn.net/zzb4702/article/details/51760678
地址爲:https://raw.githubusercontent.com/cppan/binaries/master/cppan-master-Windows-client.zip
解壓該壓縮包,將cppan所在目錄添加到系統環境變量PATH
Tesseract源碼地址爲:https://github.com/tesseract-ocr/tesseract
Cmake下載地址爲:https://cmake.org/download/
打開cmd窗口,定位到tesseract目錄,執行cppan命令,以下:
在tesseract目錄下建立build目錄,而後進入到build目錄,執行cmake ..
若是出現以下錯誤
請將tesseract目錄下的CMakeCache.txt刪除,再從新cmake ..
該過程大概須要5分鐘。
而後在build目錄下生成vs2015的工程文件
打開tesseract.sln,而後點擊生成,應該會報錯
儘管有報錯,但仍然會在tesseract\build\Debug目錄下生成tesseract40d.lib庫文件
參考連接:https://blog.csdn.net/naidoudou/article/details/70225849
若是須要生成x64的庫文件,在tesseract的目錄下,打開cmd窗口,執行如下命令(先要刪除tesseract目錄下的以前生成的CMakeList.txt緩存文件):
下圖是正在編譯時的界面
而後打開tesseract.sln,編譯生成庫文件
參考連接:https://blog.csdn.net/pragma_g/article/details/79272271
修改tesseract的CMakeList.txt文件
指定leptonica的目錄爲圖中所在目錄
而後而後打開cmake-gui,點擊configure,再點擊generate,生成vs2015的工程
參考連接:https://blog.csdn.net/yazi1297/article/details/54706390
打開Visual Studio2015,新建一個空項目,而後添加test.cpp文件,增長源代碼以下:
#include <string>
#include <baseapi.h>
#include <publictypes.h>
#include "leptonica/allheaders.h"
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
string outText;
string imPath = "E://pictest//test.bmp";
// Create Tesseract object
tesseract::TessBaseAPI *ocr = new tesseract::TessBaseAPI();
/*
Initialize OCR engine to use English (eng) and The LSTM
OCR engine.
There are four OCR Engine Mode (oem) available
OEM_TESSERACT_ONLY Legacy engine only.
OEM_LSTM_ONLY Neural nets LSTM engine only.
OEM_TESSERACT_LSTM_COMBINED Legacy + LSTM engines.
OEM_DEFAULT Default, based on what is available.
*/
ocr->Init(NULL, "chi_sim+eng+equ", tesseract::OEM_DEFAULT);
// Set Page segmentation mode to PSM_AUTO (3)
// Other important psm modes will be discussed in a future post.
ocr->SetPageSegMode(tesseract::PSM_AUTO);
// Open input image using OpenCV
Mat im = cv::imread(imPath, IMREAD_COLOR);
// Set image data
ocr->SetImage(im.data, im.cols, im.rows, 3, im.step);
// Run Tesseract OCR on image
outText = string(ocr->GetUTF8Text());
// print recognized text
cout << outText << endl;
// Destroy used object and release memory
ocr->End();
return EXIT_SUCCESS;
}
該工程選用的是OpenCV2.4,Tesseract4.0,Leptonica-1.76
於是增長對應的頭文件目錄和庫文件目錄以下
test.bmp原圖爲:
編譯運行結果以下:
可見中文徹底亂碼
針對中文亂碼狀況,網上提供解決方案,UTF--->Unicode--->Ansi
在test.cpp中增長以下兩個函數:
//utf-8轉unicode
wchar_t * CIDcardRecogizeDlg::Utf_8ToUnicode(char* szU8)
{
//UTF8 to Unicode
//因爲中文直接複製過來會成亂碼,編譯器有時會報錯,故採用16進制形式
//預轉換,獲得所需空間的大小
int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
//分配空間要給'\0'留個空間,MultiByteToWideChar不會給'\0'空間
wchar_t* wszString = new wchar_t[wcsLen + 1];
//轉換
::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);
//最後加上'\0'
wszString[wcsLen] = '\0';
return wszString;
}
//將寬字節wchar_t*轉化爲單字節char*
char* CIDcardRecogizeDlg::UnicodeToAnsi( const wchar_t* szStr )
{
int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );
if (nLen == 0)
{
return NULL;
}
char* pResult = new char[nLen];
WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );
return pResult;
}
並修改main函數:
char* test1 = ocr->GetUTF8Text();
wchar_t* tempchar = Utf_8ToUnicode(test1);
char* resulttemp = UnicodeToAnsi(tempchar);
// outText = string(ocr->GetUTF8Text());
// print recognized text
cout << resulttemp << endl;
便可解決中文亂碼問題,識別結果以下:
參考連接:https://blog.csdn.net/liulina603/article/details/45668307