由於ocr技術本身屬於乙個比較複雜比較新穎的技術,比較多軟體公司都把它作為
智財權的一部分,網路上比較難找到開發教材。因此,採用一些現有的ocr識別模組將
有助於減少開發時間,增加研發效率。
對比了一些商業模組與開源模組,覺得其中tesseract-ocr開源模組比較貼合這
次專案的要求(當前專案對文字數量少,只需要找出兩機種不同,相對來說精確度要求低)。
tesseract-ocr是一款開源的ocr識別引擎,初期引擎由hp實驗室研發,後來貢獻給了
開源軟體業,後經由google進行改進,消除bug,優化,重新發布。當前版本為3.02。
其通過不同的語言訓練庫可以支援多種語言(包括中文、日文)。
專案,發現其源**為c++,要結合到c#中程式設計比較麻煩。後來經過編譯發現其可以生成
一系列用命令列執行的程式(如:tesseract.exe,mftraining.exe,cntraining.exe等),
命令列執行"tesseract 名 輸出檔名 -l 字型檔檔案 -psm pagesegmode 配置檔案"
可以得到乙個txt檔案,其中包含文字識別的結果了。初步嘗試識別一些標準字型,
結果還算理想,但經過設計的藝術字型就識別率不高了.
所以接下來必須進行對字型檔進行訓練了,檢視說明文件,發現訓練步驟還是比較多
的,所以詳細紀錄如下:
1、首先找到各種要識別的文字的截圖,格式要是tif格式
2、用以下命令為每個tif影象生成box檔案,box檔案內容為各字元及其邊框座標
tesseract.exe lan.new.exp0.tif lan.new.exp0 -l eng batch.nochop makebox
需要注意的是,此座標的起點為左下角,即左下角為x:0 y:0。
3、此時的box檔案有可能存在識別錯誤以及字元分割錯誤,用jtessboxeditor
軟體可比較快速直觀的修改
4、把修改好的box檔案儲存,用以下命令為每個box檔案生成tr檔案
tesseract lan.new.exp0.tif lan.new.exp0 nobatch box.train
5、用unicharset_extractor程式命令列彙總這些box檔案生成計算字符集unicharset
unicharset_extractor lan.new.exp0.box …… lan.new.exp12.box
6、聚集字元特徵, 需先在當前目錄下新建檔案font_properties 檔案內容為:
tick 0 0 0 0 0 意思為:這個語言的字型為普通字型。格式如下:
然後用mftraining生成字元特徵檔案.unicharset、inttemp、pffmtable
mftraining -u unicharset -o lan.unicharset lan.new.exp0.tr ……
接著用mftraining生成字元形狀正常化特徵檔案normproto
cntraining lan.new.exp0.tr lan.new.exp1.tr
7、合併訓練檔案
把unicharset, inttemp, normproto, pffmtable,shapetable這四個檔案加上字首"lan."
這裡的字首名就是新訓練的語言字型檔的名字了。
然後使用命令:"combine_tessdata lan." (不能少了那個句點),
會生成乙個lan.traineddata 字典檔案,然後把這個檔案複製到tessract
的安裝目錄下乙個叫tessdata的資料夾裡,就可以使用新的訓練字型檔了
8、使用新的字型檔
命令列:tesseract lan.new.exp0.tif text -l lan
開啟text.txt,對照原圖,發現大部分的字型都可以識別了,但某些地方還是出現
了識別錯誤。(例如圖2的n識別成了r,c012識別成cd12。)
後來經過排除一些訓練樣品,發現主要是因為受到了同乙個字元的不同字型的
影響,例如
lan tony中n的字型是不一樣的。
解決辦法:把lan的n識別成n,以增加識別率,程式設計時可把字元變回大寫。
至於c012識別成cd12,也是因為有幾個上的0比較圓潤,導致c012識別成了
cd12,這時候我們採取了新增使用者自定義字元的方法去修正。做法如下:
tessdata目錄下新建乙個lan.user-words檔案內容為:
c012 〈換行符/n〉 [下乙個詞語]
tessdata\config目錄下新建乙個bazaar檔案,內容為:
user_words_suffix user-words
最後,把識別命令改為:
tesseract lan.new.exp0.tif text -l lan bazaar
至此,截圖中的字母就全部給識別出來了。
但還有乙個殘留問題,對於不同的字型 我想在同一種語言中分成不同的字型來表示,例如 lan.new 和 lan.new1 ,以讓他們不會衝突,但編譯的時候就會失敗
不知道是什麼原因,還望網路上的牛人幫忙解答.共同進步!
Tesseract ocr 3 02學習記錄一
光學字元識別 ocr,optical character recognition 是指對文字資料進行掃瞄,然後對影象檔案進行分析處理,獲取文字及版面資訊的過程。ocr技術非常專業,一般多是印刷 列印行業的從業人員使用,可以快速的將紙質資料轉換為電子資料。關於中文ocr,目前國內水平較高的有清華文通 ...
Tesseract ocr 3 02學習記錄一
光學字元識別 ocr,optical character recognition 是指對文字資料進行掃瞄,然後對影象檔案進行分析處理,獲取文字及版面資訊的過程。ocr技術非常專業,一般多是印刷 列印行業的從業人員使用,可以快速的將紙質資料轉換為電子資料。關於中文ocr,目前國內水平較高的有清華文通 ...
Tesseract OCR引擎 入門
ocr optical character recognition 光學字元識別,是指對檔案中的文字進行分析識別,獲取的過程。tesseract 開源的ocr識別引擎,初期tesseract引擎由hp實驗室研發,後來貢獻給了開源軟體業,後經由google進行改進,消除bug,優化,重新發布。當前版本...