這兩天由於工做須要,要到某個網站採集信息,一是要模擬登錄,二是要破解驗證碼,本想用第三方付費打碼,可是想一想網上免費的代碼也挺多的,因而乎準備從網上擼點代碼下來,誰知道,擼了好多個都不行,本人之前也沒接觸過這方面的,代碼無從下手,最後不知道在哪一個兄臺博客找到一個國外的第三方開源OCR,說是強大的谷歌公司作維護,C++開發的,有.NET封裝的連接庫,甚好!git
項目地址:https://github.com/tesseract-ocr/tesseract
語言庫:https://github.com/tesseract-ocr/langdata
OCR語言訓練:https://github.com/tesseract-ocr/tessdatagithub
下面開始擼示例:app
新建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對象!spa
下面是我測試截圖:code
上面是驗證碼,下面文件名是識別出來的結果命名保存的文件!固然驗證碼是通過處理的,原始的驗證碼圖片是醬紫的:xml
驗證碼圖片過小,OCR識別不了,並且默認狀況下,要是白底,黑子才能識別,因此網上的驗證碼必定要先本身二值化處理而且清除掉背景色,再進行識別!
我這裏的處理方式是二值化以後,把圖片放大三倍,不要擔憂看着有鋸齒,OCR能夠識別的
當初我把圖片放大兩倍,發現有的時候8會被識別成3,因此我乾脆又放大了一倍,發現不存在這個問題了,雖然看起來鋸齒感很明顯,可是OCR無論美醜對象
你是否是參照案例擼碼了,運行了?而後你發現程序運行報錯了?blog
這裏要在程序的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>
而後再運行,是否是能夠識別出來了,就是這麼簡單!