opencv+python 機讀卡識別

開源中國Digimon2017-07-16 02:03:20

長按上圖二維碼報名濟南源創會


摘要: 通過隨意一張的照片,識別其中選擇題題號,選項,以及相關數字識別。這個系列的解決方案不止一種,調參的方法也是各種各樣,反正能夠滿足需求就極好了

1.預處理


這次的機讀卡識別項目來源暑期培訓,主要包括內容一張手機拍攝的機讀卡位置定位,識別其中選擇題模塊及少量數字識別,給出樣例: 

預處理目的:

對於這個識別問題而言,把圖像變成二值圖應該是最簡單粗暴的方法了。為了找準邊界,才能良好切割。而對於邊緣檢測的函數也只能傳入灰度圖……

1.1.環境配置

環境是python3.5的,大體部分配置的是numpy+mlk版本,scipy,來支持opencv,另外輔助以imutils,這個包裏面含有4點變換函數以及matplotlib來輔助繪圖

1.2.圖片預處理 為了方便找出圖片的4個頂點,所以需要一次自適應二值化,為了使圖片效果更好,所以在二值化之前還加了一層高斯濾波

2.圖像切割


圖像切割的目的是將圖像定個便於識別的樣子。比如這裏四角變換結束以後會吧圖像變為2400*2800的大小,無論是什麼樣的案例圖片,都是這個格式,這樣最後在局部分割,如選擇題答案的識別和數字區域的確定這套程序才能有較好的通用性

2.1.邊緣檢測 

預處理得到二值圖像就很容易做邊緣檢測了,找出4個點,方便之後的4點變換

頂點座標的存放形式為3維數組,所以若想演示最大的4個頂點應做如下操作:

2.2.四點變換 

四點變換直接調用大佬寫好放在imutils中的函數就好了。這裏存了兩個,一個原圖一個灰度圖,原圖用來配合展示,灰度圖用來支配

3.對選擇題識別


3.1.對選擇題圖像部分預處理 

經過四點變換後的圖像需要經過重新轉換標準長寬,以便對選擇題部分標定題號及答案。這裏的圖像定義為2400*2800 。選擇題部分最大的特點是需要將黑塊突出,以及過濾掉沒填塗的選項,以便確認。預處理方法選擇均值濾波及二進制二值化的方法。

3.2.尋找結果中黑塊座標

這裏尋找座標的目的是為了確定黑塊所代表的題號及選項,用輪廓中心來進行描述

3.3.計算選擇題題號及答案 

比較繞,主要還是根據取餘和倍數關係

輸出運算結果:

至此完成選擇題部分 

4.數字識別,調用百度api


數字識別經過測試總的感覺還是可以。需要注意的地方是要對數字板塊需要切割出來這樣給機器會好認點,但也不能單個字拿出來。最好能有一串,同時也需要注意圖片尺寸

4.1.對數字圖像部分進行處理 

預處理部分同樣需要,步驟與選擇題模塊相似,但目的不同,文字部分主要將數字變粗,便於識別。其實也就是和選擇題模塊相比變了幾個參數

4.2.調用百度ocr api 

試過多種檢測方式,還是用別人家現成的好http://apistore.baidu.com/ 百度api使用方法: 首先需要註冊一個百度雲賬號,這樣在個人中心裏就會看到apikey。這個就是和百度進行交流的鑰匙。然後找到百度ocr的入口找到接口地址。雖然這裏給出了但還是可以看下文檔,裏面有些細節,比如圖片想免費就要300k以內。上面給的python示例代碼是py2的,這裏給出py3的方式(http://apis.baidu.com/idl_baidu/baiduocrpay/idlocrpaid)

4.3.切割圖片 

根據具體情況需要切割圖片才能讓百度api識別,具體限制因素還是圖片大小,切割方式,這裏只給出示例

之後調用,若識別為英文需要轉化,比如可能將0識別為D,這時轉換即可,如:

效果如圖展示  當然若是能想辦法去掉答題卡外圍邊框效果應該會更好……


更多幹貨請前往公眾號菜單欄“讀我”->“乾貨分享”查看。


推薦閲讀

輕鬆建站,20 個 PHP 開源內容管理系統(CMS)推薦

Go 語言飈升至前十,Java 暴跌 6.03%

如何理解並正確使用 MySql 索引

默默維護 30 年,glibc 創始人兼維護者辭職

點擊“閲讀原文”查看更多精彩內容

閲讀原文

TAGS: