最近在作身份證號碼識別,在網上搜索的一番後發現目前開源的OCR中tesseract-ocr算是比較強大的了,它由HP於1985年到1995年間開發,後來由google直接負責,通過谷歌進一步開發後,目前的tesseract-ocr有了顯著的改進。java
tesseract-ocr和Leptonica圖像庫一塊兒工做,它能夠讀取多種圖像格式,並將其轉換成超過60種語言的文本。能夠工做在Linux,Windows,Mac OSX等系統上,而且能夠在android和iphone平臺上編譯。android
目前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文件就是咱們開發所須要的庫文件。git
android中tesseract-ocr的使用在tess-two這個項目中有例子程序,不過寫的都比較簡單,這裏有個開源的識別項目,作的很好:https://github.com/rmtheis/android-ocr, 我借鑑的就是這個項目來開發的,可是用事後發現,對於身份證識別的效果並很差,識別率不是很高,並且常常識別不出來。OCR用到的識別庫:https://code.google.com/p/tesseract-ocr/downloads/list,其實咱們能夠根據本身的需求來訓練一套本身的識別庫的,比方說咱們要識別驗證碼,識別身份證號碼等,咱們就能夠用下面的方法來訓練一套識別庫。github
網上關於OCR訓練的方法不少,http://my.oschina.net/lixinspace/blog/60124, http://blog.wudilabs.org/entry/f25efc5f/這兩篇文章都是比較好的教程,我也是參照這兩篇文章來訓練的,下面結合個人操做經驗來講下訓練的過程。windows
首先咱們須要下面幾個工具:iphone
tesseract-ocr-3.01, 最新版的3.02我在我機器上用了有點問題編輯器
jTessBoxEditor, 該工具是用java寫的box編輯器工具
一、先新建一個trainocr文件夾,將上面兩個文件拷貝進來,而後解壓這兩個文件,咱們進入Tesseract-ocr文件夾下新建一個temp文件夾測試
二、接下來咱們準備好咱們須要訓練的素材以下圖字體
要想提升識別率,咱們須要提供多張像上面這樣的圖片,我訓練身份證號碼識別庫是用了50多張圖片,等訓練完了我眼睛也花了,圖片格式須要爲tiff格式的,能夠經過windows自帶的畫圖工具來另存爲tiff格式,準備好多張圖tiff圖片後,打開jTessBoxEditor.jar,以下圖
在此以前咱們須要在第1步創建的temp文件夾下新建一個custom.tif的文件,接下來咱們選擇tool–>Merge TIFF 而後選擇準備好的多張tiff圖片,注意這裏是所有選中,而後點擊打開,而後選中咱們剛剛創建的custom.tif文件,點擊保存,這樣咱們就將多張tiff圖片merge到了一個文件裏面了。
三、接下來咱們開始生成box文件了,cmd命令行進入temp文件夾下,而後輸入以下命令
D:\Trainocr\Tesseract-ocr\temp>..\tesseract.exe custom.tif custom batch.nochop makebox
輸入完後會在temp文件夾下多了個custom.box文件,該文件記錄了識別出來的每一個字和它對應的位置座標。
四、接下來就開始矯正了,一樣使用jTessBoxEditor工具,咱們切換到Box Editor,而後open打開custom.tif,如圖
經過右上角的X,Y,W,H對每一個須要改正的字符進行調整,注意調整好後別忘記保存。
五、接下來是計算字符集,輸入以下命令
D:\Trainocr\Tesseract-ocr\temp>..\unicharset_extractor.exe custom.box
六、接下來咱們須要在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
七、Clustering,輸入命令
D:\Trainocr\Tesseract-ocr\temp>..\cntraining.exe custom.tr
八、此時在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
就能夠經過新的字典來識別,測試結果代表,識別率確實提升了。現實應用中咱們須要使用多張圖片來經過上面的步驟來生成咱們須要的識別庫,這樣識別率才能提升。