基於tesseract-OCR進行中文識別

基於tesseract-OCR進行中文識別

1. 環境準備

1.1 下載

下載Tesseract-OCR安裝包,地址爲:

https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w32-setup-v4.0.0-beta.1.20180608.exe

 參考鏈接:https://github.com/tesseract-ocr/tesseract

1.2 安裝

雙擊安裝,語言庫部分選擇math,chinese simplified.

1.3 添加環境變量

將Tesseract-OCR安裝目錄加入環境變量,

變量名TESSDATA_PREFIX

變量值F:\Program Files (x86)\Tesseract-OCR\tessdata

1.4 測試

將以下圖片保存爲test.jpg,然後放在E盤根目錄下

 

在cmd窗口中執行 tesseract test.jpg test.txt –l chi_sim+eng(chi_sim是中文識別包,equ是數學公式包,eng是英文包),即可將圖片中的文字識別出來,識別結果如下:

 

1.5 語言庫

語言庫地址爲:https://github.com/tesseract-ocr/tessdata

將所需要的語言庫下載下來,放在F:\Program Files (x86)\Tesseract-OCR\tessdata目錄下

1.6 編譯生成定製的字庫

採用jTessBoxEditor 生成自己的字庫。

1.6.1 軟件準備

首先需要安裝java虛擬機10.0.2+jTessBoxEditor。

jTessBoxEditor下載地址:

 https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/

這裏我們下載jTessBoxEditorFX-2.0.1.zip版本,帶FX的版本,才支持中文字符編輯。

1.6.2 字庫製作

字庫製作具體步驟:

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

 

1.7 Leptonica編譯

下載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

1.8 Tesseract 編譯

1.8.1 下載&配置cppan

地址爲:https://raw.githubusercontent.com/cppan/binaries/master/cppan-master-Windows-client.zip

解壓該壓縮包,將cppan所在目錄添加到系統環境變量PATH

1.8.2 Tesseract源碼下載

Tesseract源碼地址爲:https://github.com/tesseract-ocr/tesseract

1.8.3 Cmake下載

Cmake下載地址爲:https://cmake.org/download/

 

1.8.4 Tesseract編譯

打開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 

1.8.5 另一種方法編譯tesseract

修改tesseract的CMakeList.txt文件

 

指定leptonica的目錄爲圖中所在目錄

然後然後打開cmake-gui,點擊configure,再點擊generate,生成vs2015的工程

 

參考鏈接:https://blog.csdn.net/yazi1297/article/details/54706390

2. 項目開發

2.1 新建工程

打開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;

}

2.2 工程配置

該工程選用的是OpenCV2.4,Tesseract4.0,Leptonica-1.76

因而增加對應的頭文件目錄和庫文件目錄如下

 

2.3 編譯運行

test.bmp原圖爲:

 

編譯運行結果如下:

 

可見中文完全亂碼

2.4 中文亂碼

針對中文亂碼情況,網上提供解決方案,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

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