Tesseract-OCR使用有感

這玩意兒就只有一個Tesseract.dll 就算有其它的加上x64目錄下的另外兩個dll leptonica-1.80.0.dll  tesseract41.dll也不過幾兆而已,可是 可是 可是 加上字庫文件可就大了 幾十兆 。也充分說明了這玩意兒跟我原先說的同樣的主要在於字庫的匹配。若是隻識別數字英文這種 那你調用百度的庫反而是個大包袱還必須聯網,近期聽到一段話 世界上本沒有標準件 行業造成了也就有了標準件。資本主義國家造成了標準件 因而咱們也就只有在別人的框框裏鑽來鑽去 始終跳不出這個圈兒,若是你明白原理的話就知道實際上是不須要標準件的,造輪子纔有樂趣嘛,哇哈哈哈。html

使用過程仍是很簡單的。首先使用nu-get安裝Tesseract ,注意搜索的時候標題是tesseract 而後 做者是charles weld 版本是v4.1.1的那個 不要弄錯了,個人項目.NetFramework框架是4.0 安裝完成後會自動爲咱們添加tesseract的引用。而後網上隨意抄一段函數,功能是給一個圖片調用引擎識別圖片裏的文字:java

 1 private List<string> GetProductNumberFromImage(string imagePath)
 2 {
 3     List<string> resultList = new List<string>();//chi_sim
 4     //using (var ocr = new TesseractEngine(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"), "normal", EngineMode.Default))
 5     using (var ocr = new TesseractEngine(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"), "eng", EngineMode.Default))
 6     {                
 7         //ocr.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");//
 8         var pix = PixConverter.ToPix(new Bitmap(imagePath));
 9         using (var page = ocr.Process(pix))
10         {
11             string text = page.GetText();
12             if (!string.IsNullOrEmpty(text))
13             {
14                 resultList.Add(text);
15                
16             }
17         }
18     }
19     return resultList;
20 }

仍是那句話 遇事先冷靜想一想爲何老是有好處的。demo運行不起的時候 仔細看代碼tessdata的字符 噢 原來如此 嘗試下吧,須要事先下載名爲eng.traineddata的語言文件置於你編譯好的執行文件目錄下的tessdata目錄,果真。程序員

還可使用此語句預約義識別內容框架

1 ocr.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");

在數字和英文的狀況下識別率還能夠的。中文的話就有些慘了。函數

 

 因而咱們須要進行校訂 ,說實話校訂的過程比上面麻煩多了 又要敲命令又要咋的 麻煩的一逼,須要用到一堆工具。
這些打成包的工具在此地址下載https://sourceforge.net/projects/vietocr/   工具

下載好後咱們參照這篇文章進行實施https://www.cnblogs.com/wzben/p/5930538.html
大概過程就是用工具敲dos命令生成box文件 其實也就是一個帶方框的字體描述文件 告訴你係統目前是怎樣識別的,而後用一個GUI工具 jTessBoxEditor 在界面上對文本的寬高 框選範圍調整 對應哪一個漢字 進行校訂。 
學習

當我運行train.bat 運行不起的時候彈出 Windows找不到javaw 的時候咋辦啊 不要去糾字面意思 ,估計是須要安裝jdk吧 嘗試一下安裝jdk8 果真如此。訓練字庫的過程當中 報錯了 Failed to load font_properties from font_properties ,找到一篇博文 https://blog.csdn.net/dragoo1/article/details/8439272 大概看了下沒錯就是他了 照着實施 bingo 搞定。測試

 

可以進行到這一步說明你還能不厭其煩,還能清晰思考說明你是個合格的程序員。 稍微注意下你會發現問題的關鍵那就是對於漢字的 寬高判別  和部首偏旁偏旁的區域歸併 識別引擎很難斷定,該框選的不做爲一個字單位處理,不應框選的多框 ,這個對識別率影響很大。就連調用微軟office的MODI漢字識別率也不見得多高。關鍵點就在於每單位字寬高的智能判斷,相信百度那些也只不過針對這些點進行解決了的而已。用的是別人的引擎即便開源的這複雜度 字單位寬高智能判斷咱們是改不動的 這裏咱們只是循序漸進的進行模板訓練 以提升識別率。 字體

經歷一些麻煩的校訂和命令操做獲得一個normal.traineddata 文件 ,複製到debug下的tessdata目錄。注意字庫載入代碼更改爲normal。spa

1 using (var ocr = new TesseractEngine(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"), "normal", EngineMode.Default))

實際上基於模板匹配的這種規規矩矩的OCR已是很是很是基礎的了,畢竟Tesseract-OCR那只有幾兆的體積 連我上面說的文本行檢測 漢字智能切割 這種都沒有 也有多是我沒找到使用方式 谷歌維護的還支持深度學習應該仍是能夠的 ,可是目前就個人使用感來講的話通常般只是一個將就用了。 把他吹的多麼好又是開源的 由於基本上何耐市面上一個能用的免費的了 其它的已是垃圾中的垃圾了,其它的商用的別人也不會拿出來給免費用的你說對吧

再次測試稍許提升了識別率,好,zhongguo特點的"差很少任務"差很少先生,成功達成任務目標。交差了事

最後:咱們本身訓練了一個庫,而後有從官網下載好的默認的庫。若是上面一折騰不就只能使用咱們本身訓練的那幾個字了嗎,豈不是識別率更低 要這樣還不如不訓練呢,對於這一點網上的全部帖子都沒作一個明確的說明 很扯淡。經過下面的初始化方式就能你本身的庫+官方字庫一塊兒使用,normal是你上面訓練出的字庫的名稱,本人親測有效。

1 using (var ocr = new TesseractEngine(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"), "normal+eng", EngineMode.Default))

以此經驗分享給盆友們願你們少走一些彎路。

相關文章
相關標籤/搜索