摘要:你說我一個學電氣的,怎么就跑來寫驗證碼識別了呢。我當時就念了兩句代碼,茍言歸正傳,驗證碼識別主要分兩部分圖像分割和識別。其中,分割驗證碼是最麻煩的,因為基本沒有一勞永逸的分割方法。
原blog在這里>> https://github.com/100steps/B... 因為訪問Github太慢所以重新上傳了圖片,下面才是正文。。
這個鍋本來是若花的,然而不知不覺就甩我背上了。你說我一個學電氣的,怎么就跑來寫驗證碼識別了呢。波小跟我說,組織上決定了,由我來寫這個。我當時就念了兩句代碼,print "茍....
言歸正傳,驗證碼識別主要分兩部分:圖像分割和識別。其中,分割驗證碼是最麻煩的,因為基本沒有一勞永逸的分割方法。
本文基于opencv2.4,有興趣的可以去了解一下。
圖像分割我們先來看看教務的驗證碼。
可以看到,是個72x27像素的矩形,而且每個字符的顏色都是一樣的,所以只要提取那個顏色的像素就可以分離出字符了。聽起來很簡單是不是?
首先我要表揚一下若花,因為若花的項目雖然tj了,里面用到的分割算法確是非常贊的。那么我們先來看一下若花是怎樣做的。
這個GIF所演示的就大致是若花的算法了,若花當時對我說的是“染色”,也就是油漆桶算法(又叫種子填充算法,Floodfill)。說實話看了若花的代碼,我深有感觸。首先,若花自己一個人寫了前端和后臺,前端用了npm、bootstrap,還用了ajax,要是讓我來寫。。。。。。估計又要在群上喊耀宗了。其次是算法的實現都是若花都是用php寫的,php在這方面有點先天弱勢,但是若花還是寫出來了,所以要給若花點個贊。
但是說了這么多,我最終還是沒有采用這個算法。為什么呢?
因為這個算法有個致命的問題,對于ij這樣帶有非聯通區域的字母,會把上面的點漏掉。。。。。。這就很尷尬了。我一開始想,能不能先給出每個字母的最小區間,再對區間內的字符顏色的像素染色,這樣就有很大幾率可以把點也染上,因為寫過原生的php生成驗證碼的代碼,知道字符雖然有旋轉和位移,一開始的位置還是有規律的。如果想分離出單個字符,可以直接使用RGB中R的通道,第一個字符就+1,第二個+2,第三個+4,第四個+8,這樣數一下R的大小就可以把字符分開,還可以知道哪些字符相連,然后相連字符再重新分隔。
但是后來我又放棄了,因為我比若花還要懶找到了更好的方法。之前的方案要統計一定數量的驗證碼來確定每個字符的最小染色起始區間,還要把php寫的染色算法改寫成python。
所以最后,我使用了opencv自帶的k-means算法。這個算法的好處在于有現成的函數可以偷懶不但可以分割提取字符,還可以找出每個字符的中心點。中心點可是個好東西,不但可以確定字符的次序,還可以對每個字符標準化,方便后續的特征提取。
說到特征提取,若花好像就是卡在這一步。他的分類器好像都基本寫完了,而且是php寫的,說實話真的很厲害。。。
我這里使用了ocr例程里的方向梯度直方圖Histogram of Oriented Gradients (HOG)作為特征向量。在計算 HOG 前還要使用圖片的二階矩對其進行抗扭斜(deskew)處理,然后把每個字符分成4塊,我這里把27x27的字符分成了14x14的小方塊,然后計算圖像 X 方向和 Y 方向的 Sobel 導數(這個不是很懂,如果有人知道請告訴我)。然后計算得到每個像素的梯度的方向和大小。把這個梯度轉換成 16 位的整數。將圖像分為 4 個小的方塊,對每一個小方塊計算它們的朝向直方圖(16 個 bin),使用梯度的大小做權重。這樣每一個小方塊都會得到一個含有 16 個成員的向量。4 個小方塊的 4 個向量就組成了這個圖像的特征向量(包含 64 個成員)。這就是我們要訓練數據的特征向量。
圖像識別這里我用在knn和svm中選用了svm。knn每次識別都要遍歷一遍現有數據,隨著數據的增加識別速度會下降,而svm就沒有這個問題。svm有很多相關資料可以查,比如前面給的鏈接,這里就不細說。而且opencv自帶的svm并不是最好的,3.0版還有bug,無法導入訓練好的模型:(
識別速度還算令人滿意。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40776.html
摘要:可惜收費的,今天要介紹的完美驗證碼識別系統是類似的免費產品。調用函數相當簡單的,對比復雜的參數,這個識別是相當的快捷。 此文已由作者徐迪授權網易云社區發布。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗。 講到驗證碼識別,大家第一個可能想到tesseract。誠然,對于OCR而言,tesseract確實很強大,自帶的字模能識別絕大多數規整的中英文。但是驗證碼畢竟不是OCR。對于現在...
摘要:圖片驗證碼是目前最常用的一種。神經網絡以上驗證碼識別都依賴于字符切分,切分的好壞幾乎直接決定識別的準確程度。目前驗證碼識別最先進的是谷歌在識別街景圖像中門牌號碼中使用的一套的算法。 全自動區分計算機和人類的圖靈測試(Completely Automated Public Turing test to tell Computers and Humans Apart,簡稱CAPTCHA),...
摘要:為了應付這種情況,很多網站加大驗證碼識別難度,復雜的驗證碼甚至讓用戶都很難識別了,這種方式劣勢十分明顯,糟糕的用戶體驗最終會讓網站流失用戶,這便是為什么有人吐槽網站的驗證碼的原因了。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗。 首先來談談驗證碼的機制,驗證碼作為一種人機識別手段,其終極目的,就是區分正常人和機器的操作。而對于沒有驗證碼的場景,比如用戶登陸,則機器可以同時、大批量...
閱讀 2813·2023-04-25 15:01
閱讀 3012·2021-11-23 10:07
閱讀 3358·2021-10-12 10:12
閱讀 3444·2021-08-30 09:45
閱讀 2184·2021-08-20 09:36
閱讀 3566·2019-08-30 12:59
閱讀 2424·2019-08-26 13:52
閱讀 927·2019-08-26 13:24