1. 程式人生 > >基於opencv的身份證識別系統

基於opencv的身份證識別系統

一、前言

本文主要實現了對身份證圖片上身份證號碼的自動識別,在Qt平臺上使用opencv進行影象處理,並繪製簡單的使用者介面,設計了一個基於Qt和opencv的身份證號碼識別系統。

二、使用者介面

       使用者介面如下所示,簡單幾個控制元件,這裡只是實現了身份證號碼的識別,而沒有對漢字(姓名及地址)識別,水平尚且不足。


三、身份證影象處理流程

下圖為身份證識別系統的系統框圖。


四、影象二值化處理

再開啟一副圖片,也即獲取一副彩色身份證圖片後,為使得身份證號碼顏色與背景色呈現較大差別,故選取R分量作為彩色影象的灰度化,接著對影象進行二值化處理。這裡需要獲取影象的全域性閾值和區域性閾值。

首先由Otsu演算法(opencv已實現)獲得整幅影象的全域性閾值T,再由Beresen方法計算得當前畫素的領域視窗內的灰度均值Tbn,再利用整個影象的最大灰度值和最小灰度值計算得到一個矯正因素b,則二值化公式可由下式子確定


其中T為Ostu全域性閾值,Tbn由下式確定: 


b由下式確定: 


其中g2為影象中灰度的最大值,g1為影象中灰度的最小值,C為經驗係數,通常取0.12演算法在函式OstuBeresenThreshold實現,實現的效果如下所示:


五、身份證號碼定位

       將二值化得到的影象進行黑白反色處理,即背景為黑色,身份證號碼為白色,接著對影象進行閉操作後,使用findContours檢測二值影象中的白色畫素塊的外輪廓,將符合長寬比及面積要求的輪廓提取出來。要找到的輪廓如下所示:


要做漢字識別的話,可以在這部分將漢字區域定位並剪切出來

六、號碼分割

觀察到所獲得的裁剪出來的身份證號碼影象(已經縮放至300*20解析度大小)如下所示:

 

在該影象中,顯然身份證號碼與背景影象顏色區分度高,故進反色後,使用Otsu方法二值化後可得


要將號碼分割出來,則只需進行列分割,也即統計

其中f(x,y)為介於兩個字元之間的畫素,該過程由函式char_segment實現

七、特徵提取

提取數字字元的特徵向量,也即提取梯度分佈特徵+灰度分佈特徵+水平投影直方圖+垂直投影直方圖,最後每個字元得到一個1*72的特徵向量,由calcGradientFeat函式實現

八、神經網路訓練

所使用的訓練圖片均由從多張身份證圖片上分割得到,之後經過特徵提取,獲得訓練矩陣和標籤矩陣保存於ann_xml.xml檔案中,由函式getAnnXML實現,然後由ann_train從中讀取訓練矩陣和標籤矩陣用於神經網路訓練,opencv中實現的是多層感知器神經網路。

九、分類器分類

使用訓練得的神經網路對所提取的字元特徵向量進行分類,由函式classify實現。

十、校驗位計算

由於最後一位有時識別率不高,可能是最後一位的分割結果不是很好,故最後1位校驗位直接由前17位數字計算得,由getParityBit函式實現。

十一、結果顯示

該身份證號碼識別系統所處理的影象必須要求身份證區域儘可能佔整幅影象更多的區域,且在純色背景下拍攝,另外需保證拍攝得的身份證影象儘可能光照均勻,不能有高光存在。如下所示


系統識別結果示意如下:


所使用身份證圖片均來自百度搜索

源程式下載:http://download.csdn.net/detail/ap1005834/9530222