Android ocr識別文字介紹
最近在做身份證號碼識別,在網上搜索的一番后發現目前開源的OCR中tesseract-ocr算是比較強大的了,它由HP于1985年到1995年間開發,后來由google直接負責,經過谷歌進一步開發后,目前的tesseract-ocr有了顯著的改進。
tesseract-ocr和Leptonica圖像庫一起工作,它可以讀取多種圖像格式,并將其轉換成超過60種語言的文本。可以工作在Linux,Windows,Mac OSX等系統上,并且可以在android和iphone平臺上編譯。
目前android版本在這個地址:https://code.google.com/p/tesseract-android-tools/, 這個版本需要自己下載很多關聯的庫文件,我在編譯的時候出了很多問題,后來沒辦法又在網上找到了這個項目:https://github.com/rmtheis/tess-two, 說是tesseract-ocr-tool的一個分支,這個版本的好處是很多相關的庫都已經為我們配置好了,我們只要git clone下來編譯下就行了,github上相關介紹說的很詳細,編譯的過程這里就不做介紹了,我在編譯的時候出現了permission權限的問題,文 件的權限用chmod 777 ./ 這個命令修改下就Ok了。最后編譯好的在libs下的so文件就是我們開發所需要的庫文件。
android中tesseract-ocr的使用在tess-two這個項目中有例子程序,不過寫的都比較簡單,這里有個開源的識別項目,做的很好:https://github.com/rmtheis/android-ocr, 我借鑒的就是這個項目來開發的,但是用過后發現,對于身份證識別的效果并不好,識別率不是很高,而且經常識別不出來。OCR用到的識別庫:https://code.google.com/p/tesseract-ocr/downloads/list,其實我們可以根據自己的需求來訓練一套自己的識別庫的,比方說我們要識別驗證碼,識別身份證號碼等,我們就可以用下面的方法來訓練一套識別庫。
網上關于OCR訓練的方法很多,http://my.oschina.net/lixinspace/blog/60124, http://blog.wudilabs.org/entry/f25efc5f/這兩篇文章都是比較好的教程,我也是參照這兩篇文章來訓練的,下面結合我的操作經驗來說下訓練的過程。
首先我們需要下面幾個工具:
tesseract-ocr-3.01, 最新版的3.02我在我機器上用了有點問題
jTessBoxEditor, 該工具是用java寫的box編輯器
1、先新建一個trainocr文件夾,將上面兩個文件拷貝進來,然后解壓這兩個文件,我們進入Tesseract-ocr文件夾下新建一個temp文件夾
2、接下來我們準備好我們需要訓練的素材如下圖
要想提高識別率,我們需要提供多張像上面這樣的圖片,我訓練身份證號碼識別庫是用了50多張圖片,等訓練完了我眼睛也花了,圖片格式需要為tiff格式 的,可以通過windows自帶的畫圖工具來另存為tiff格式,準備好多張圖tiff圖片后,打開jTessBoxEditor.jar,如下圖
在此之前我們需要在第1步建立的temp文件夾下新建一個custom.tif的文件,接下來我們選擇tool–>Merge TIFF 然后選擇準備好的多張tiff圖片,注意這里是全部選中,然后點擊打開,然后選中我們剛剛建立的custom.tif文件,點擊保存,這樣我們就將多張 tiff圖片merge到了一個文件里面了。
3、接下來我們開始生成box文件了,cmd命令行進入temp文件夾下,然后輸入如下命令
D:\Trainocr\Tesseract-ocr\temp>..\tesseract.exe custom.tif custom batch.nochop makebox
輸入完后會在temp文件夾下多了個custom.box文件,該文件記錄了識別出來的每個字和它對應的位置坐標。
4、接下來就開始矯正了,同樣使用jTessBoxEditor工具,我們切換到Box Editor,然后open打開custom.tif,如圖
通過右上角的X,Y,W,H對每個需要改正的字符進行調整,注意調整好后別忘記保存。
5、接下來是計算字符集,輸入如下命令
D:\Trainocr\Tesseract-ocr\temp>..\unicharset_extractor.exe custom.box
6、接下來我們需要在temp文件夾下建一個font_properties文件,3.01版本的OCR需要這個文件,該文件的目的是提供輸出時識別出來的字體樣式信息,文件的格式為
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
timesitalic 1 0 0 1 0
我們可以根據實際情況新建font_properties,我寫的是
custom 0 0 0 0 0
意思是普通字體,沒有任何格式。
然后執行以下命令
D:\Trainocr\Tesseract-ocr\temp>..\mftraining.exe -F font_properties -U unicharset custom.tr
7、Clustering,輸入命令
D:\Trainocr\Tesseract-ocr\temp>..\cntraining.exe custom.tr
8、此時在temp文件夾下已經有很多文件了,需要把inttemp,Microfeat,normproto,pffmtable,unicharset這幾個文件加上前綴custom. (注意有個點號),然后輸入以下命令
D:\Trainocr\Tesseract-ocr\temp>..\combine_tessdata.exe custom.
出來的結果中我們需要確定type 1,type3, type4, type5對應的后面數據不能為-1,這樣我們就可以用這個新字典來識別了,將生成的custom.traineddata文件拷貝到tessdata文件夾下,然后
tesseract test.jpg result | custom
就可以通過新的字典來識別,測試結果表明,識別率確實提高了。現實應用中我們需要使用多張圖片來通過上面的步驟來生成我們需要的識別庫,這樣識別率才能提高。