這兩天因為工作需要,要到某個網站采集信息,一是要模擬登陸,二是要破解驗證碼,本想用第三方付費打碼,但是想想網上免費的代碼也挺多的,於是乎准備從網上擼點代碼下來,誰知道,擼了好多個都不行,本人以前也沒接觸過這方面的,代碼無從下手,最后不知道在哪個兄台博客找到一個國外的第三方開源OCR,說是強大的谷歌公司做維護,C++開發的,有.NET封裝的鏈接庫,甚好!
項目地址:https://github.com/tesseract-ocr/tesseract
語言庫:https://github.com/tesseract-ocr/langdata
OCR語言訓練:https://github.com/tesseract-ocr/tessdata
下面開始擼示例:
新建C#控制台,版本選擇.NET 4.5
Tesseract ocr = new Tesseract(); ocr.SetVariable("tessedit_char_whitelist", "0123456789"); ocr.Init(@"D:\測試\Ocr\tessdata", "eng", true);
第一句就不用說了,第二句是設置識別的字符,例如,如果你要識別的驗證碼是A-Z0-9你就都寫進來就OK了
第三句就是初始化OCR的語言訓練配置,里面很多文件,只要寫文件名小數點前面的就OK了
List<Word> result = ocr.DoOCR(bmp, Rectangle.Empty); if(result.Count<=0)return; string code = result[0].Text;
最后的Code就是識別出來的驗證碼了,這里驗證碼圖片一定要轉換為Bitmap對象才行,記得用完了釋放Bitmap對象!
下面是我測試截圖:
上面是驗證碼,下面文件名是識別出來的結果命名保存的文件!當然驗證碼是經過處理的,原始的驗證碼圖片是醬紫的:
驗證碼圖片太小,OCR識別不了,而且默認情況下,要是白底,黑子才能識別,所以網上的驗證碼一定要先自己二值化處理並且清除掉背景色,再進行識別!
我這里的處理方式是二值化之后,把圖片放大三倍,不要擔心看着有鋸齒,OCR可以識別的
當初我把圖片放大兩倍,發現有的時候8會被識別成3,所以我干脆又放大了一倍,發現不存在這個問題了,雖然看起來鋸齒感很明顯,但是OCR不管美丑
你是不是參照案例擼碼了,運行了?然后你發現程序運行報錯了?
這里要在程序的app.config的startup節點加上 useLegacyV2RuntimeActivationPolicy="true"節點,詳細如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
然后再運行,是不是可以識別出來了,就是這么簡單!