Tesseract是一個開源的OCR(Optical Character Recognition,光學字符識別)引擎,能夠識別多種格式的圖像文件並將其轉換成文本,目前已支持60多種語言(包括中文)。 Tesseract最初由HP公司開發,後來由Google維護,目前發佈在Googel Project上。地址爲http://code.google.com/p/tesseract-ocr/。svn
1.安裝Tesseract工具
從http://code.google.com/p/tesseract-ocr/downloads/list下載Tesseract,目前版本爲Tesseract3.02。由於只是測試使用,這裏直接下載winodws下的安裝文件tesseract-ocr-setup-3.02.02.exe。安裝成功後會在相應磁盤上生成一個Tesseract-OCR目錄。經過目錄下的tesseract.exe程序就能夠對圖像字符進行識別了。測試
2.準備一副待識別的圖像,這裏用畫圖工具隨便寫了一串數字,保存爲number.jpg,以下圖所示:字體
3. 打開命令行,定位到Tesseract-OCR目錄,輸入命令:google
[plain] view plaincopyspa
tesseract.exe number.jpg result -l eng .net
其中result表示輸出結果文件txt名稱,eng表示用以識別的語言文件爲英文。命令行
3. 打開Tesseract-OCR目錄下的result.txt文件,看到識別的結果爲7542315857,有3個字符識別錯誤,識別率還不是很高,那有沒有什麼方法來提供識別率呢?Tesseract提供了一套訓練樣本的方法,用以生成本身所需的識別語言庫。下面介紹一下具體訓練樣本的方法。code
關於如何訓練樣本,Tesseract-OCR官網有詳細的介紹http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3。這裏經過一個簡單的例子來介紹一下如何進行樣本訓練。orm
1.下載工具jTessBoxEditor. http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,這個工具是用來訓練樣本用的,因爲該工具是用JAVA開發的,須要安裝JAVA虛擬機才能運行。
2. 獲取樣本圖像。用畫圖工具繪製了5張0-9的文樣本圖像(固然樣本越多越好),以下圖所示:
3.合併樣本圖像。運行jTessBoxEditor工具,在點擊菜單欄中Tools--->Merge TIFF。在彈出的對話框中選擇樣本圖像(按Shift選擇多張),合併成num.font.exp0.tif文件。
4.生成Box File文件。打開命令行,執行命令:
[plain] view plaincopy
tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox
生成的BOX文件爲num.font.exp0.box,BOX文件爲Tessercat識別出的文字和其座標。
注:Make Box File 文件名有必定的格式,不能隨便亂取名字,命令格式爲:
[plain] view plaincopy
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
其中lang爲語言名稱,fontname爲字體名稱,num爲序號,能夠隨便定義。
【Yasi】:先前本身定義了tessdata的環境變量 TESSDATA_PREFIX 值爲 E:\tesseract\tessdata,但沒有從tesseract源文件目錄中將tessdata子目錄中的內容copy到 E:\tesseract\tessdata 中,形成上面的命令報錯,說找不到batch.nochop 和 makebox。解決辦法:將 tesseract 源文件目錄中全部文件和子文件夾(可能充分但非必要,先無論這些啦)copy到 E:\tesseract\tessdata 中。
5.文字校訂。運行jTessBoxEditor工具,打開num.font.exp0.tif文件(必須將上一步生成的.box和.tif樣本文件放在同一目錄),以下圖所示。能夠看出有些字符識別的不正確,能夠經過該工具手動對每張圖片中識別錯誤的字符進行校訂。校訂完成後保存便可。
【Yasi】這裏必須修改識別錯誤的字符,不然作出來的traineddata文件也是錯的。能夠在下面的界面中修改並保存,也能夠直接在traineddata文件中修改。
6.定義字體特徵文件。Tesseract-OCR3.01以上的版本在訓練以前須要建立一個名稱爲font_properties的字體特徵文件。
font_properties不含有BOM頭,文件內容格式以下:
[plain] view plaincopy
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
其中fontname爲字體名稱,必須與[lang].[fontname].exp[num].box中的名稱保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值爲1或0,表示字體是否具備這些屬性。
這裏在樣本圖片所在目錄下建立一個名稱爲font_properties的文件,用記事本打開,輸入如下下內容:
[plain] view plaincopy
font 0 0 0 0 0
這裏全取值爲0,表示字體不是粗體、斜體等等。7.生成語言文件。在樣本圖片所在目錄下建立一個批處理文件,輸入以下內容。
[plain] view plaincopy
rem 執行改批處理前先要目錄下建立font_properties文件
echo Run Tesseract for Training..
tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train
echo Compute the Character Set..
unicharset_extractor.exe num.font.exp0.box
mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr
echo Clustering..
cntraining.exe num.font.exp0.tr
echo Rename Files..
rename normproto num.normproto
rename inttemp num.inttemp
rename pffmtable num.pffmtable
rename shapetable num.shapetable
echo Create Tessdata..
combine_tessdata.exe num.
將批處理經過命令行執行。執行後的結果以下:
需確認打印結果中的Offset 一、三、四、五、13這些項不是-1。這樣,一個新的語言文件就生成了。
num.traineddata即是最終生成的語言文件,將生成的num.traineddata拷貝到Tesseract-OCR-->tessdata目錄下。能夠用它來進行字符識別了。
用訓練後的語言庫識別number.jpg文件, 打開命令行,定位到Tesseract-OCR目錄,輸入命令:
[plain] view plaincopy
tesseract.exe number.jpg result -l eng
識別結果如如圖所示,能夠看到識別率提升了很多。經過自定義訓練樣本,能夠進行圖形驗證碼、車牌號碼識別等。感興趣的朋友能夠研究研究。
下面是num-yasi.png
將生成的num.traineddata拷貝到E:\tesseract\tessdata,即環境變量TESSDATA_PREFIX 設置的路徑下,執行下面的命令(注意第二條命令結尾是num,即新加的traineddata,而不是eng)
[plain] view plain copy
E:\tesseract\tesseract-svn\vs2008\LIB_Debug\tesseractd.exe num-yasi.png result-eng -l eng
E:\tesseract\tesseract-svn\vs2008\LIB_Debug\tesseractd.exe num-yasi.png result-num -l num
下圖是兩次識別結果對比
使用eng traineddata的結果徹底不靠譜;使用了本身的traineddata,識別出來的固然都是數字,但正確率實在糟糕。多是我本身手寫的字體和用來作traineddata的手寫數字的字體差異太大了吧。