程習武,李旭偉,張德江,劉元梓
(四川大學計算機學院,成都 610065)
基于像素匹配的Android平臺身份證號碼實時識別
程習武,李旭偉,張德江,劉元梓
(四川大學計算機學院,成都610065)
Android;圖像識別;身份證號碼;實時
隨著信息化技術(shù)的發(fā)展和智能手機的日益普及和平民化,以Android應用為代表的移動應用越來越廣泛,為人們的生活帶來了諸多方便。一款移動應用能否贏得用戶,除了功能實用、界面美觀外,操作的便利和簡單也是一項重要指標。作為一款優(yōu)秀的移動應用,與用戶的交互應該盡可能地簡單方便,盡量減少用戶繁鎖的輸入。眾所周知,阿里巴巴集團的“支付寶錢包”App中掃一掃識別銀行卡號的功能,極大地提高了用戶輸入銀行卡號的速度,減少了出錯率,無需用戶一遍一遍進行核對,十分方便。而對于公民身份證號來說,目前二代身份證號普遍為18位,比銀行卡號更長,對于中老年用戶來說要輸入這么長一串數(shù)字非常繁鎖,如果能夠像支付寶錢包一樣采用自動識別的技術(shù)來進行輔助輸入,將會為身份證號碼的輸入提供極大的便利。
通過對Android市場類似App的考察發(fā)現(xiàn),銀行卡號識別與商品條碼、二維碼識別以及名片識別之類的應用已經(jīng)較為廣泛,但目前還沒有通過圖像識別的方法來實時識別身份證號的App應用。對于身份證信息的讀取,在銀行、鐵路交通部門、旅館等目前使用的身份證讀卡器無疑是最準確最快速的一種手段,但身份證讀卡器的使用需要與公安部門聯(lián)網(wǎng),必須得到公安部門的許可,而且需要附加一套讀卡設備,對于普通的App應用來說可行性不高。
采用圖像識別技術(shù)識別身份證號碼這種十分規(guī)范的數(shù)字,利用目前比較成熟的圖像處理技術(shù)如OpenCV、C++、MATLAB等可以輕易實現(xiàn),但把這些第三方庫集成到Android平臺或其他移動平臺上來,則難度較大。雖然移動應用市場上關(guān)于名片識別的App已經(jīng)較為普遍,如“夏普名片識別”,但其使用的是一套通用的OCR文字識別庫,是針對所有字符的識別庫,僅用來處理身份證號碼中的0-9十個數(shù)字來說顯得比較臃腫,目前還沒有專門針對身份證號碼識別的庫。還有一種商用的身份證號碼識別App如 “文通證件識別”,其采用的文字識別庫與“夏普名牌識別”如出一轍,其操作方式是先拍照保存,然后對保存的照片進行識別,沒有做到實時性,操作不夠人性化且不利于與其他應用進行集成,而且其源碼不公開,使用費用相對較高。
本文通過最簡單的像素匹配技術(shù),在Android平臺上實現(xiàn)了對身份證號碼的實時采集和識別,未使用任何圖像識別相關(guān)的第三方庫,不會增加App的體積,不需要額外的硬件和網(wǎng)絡開銷,極大地增強了應用的普適性。
為更加清晰地說明本文設計思想,本文單獨設計了一個簡單的Android應用,如果需集成到具體的項目中,可以將本項目中的Java類打包成JAR包引入到具體的項目中進行調(diào)用,或者直接將本項目中的Java類拷貝到具體的項目中去。
1.1系統(tǒng)設計
App只有一個界面,打開即顯示掃描界面,在光線良好的情況下,將手機攝像頭正對身份證樣本進行取景,App會循環(huán)對身份證進行掃描并識別,直到識別成功后停止掃描,同時彈出對話框顯示識別結(jié)果供用戶確認。
(1)構(gòu)造數(shù)字模型矩陣
①制作樣本。利用Photoshop或其他繪圖軟件摳取身份證中的數(shù)字0-9作為樣本,如圖1 所示。
圖1 初始數(shù)字圖像樣本
②樣本預處理,主要是去色和增加對比度,減少程序處理時的噪聲。
③樣本二值化。本文編寫了一個簡單的程序?qū)Υ?0個樣本圖像進行二值化處理,通過程序掃描像素矩陣,取得每一個像素點的R、G、B顏色值,如果同時滿足R<180、G<180、B<180,則將此像素點置為黑色,即0xFF000000,否則置為白色,即0xFFFFFFFF。經(jīng)過二值化處理后的樣本圖像如圖2 所示:
圖2 二值化處理后的數(shù)字圖像樣本
④數(shù)字化樣本圖像。再次遍歷二值化后的樣本圖像,構(gòu)造樣本數(shù)組,如果是白色,存為1,如果是黑色存為0,得到0-9的像素數(shù)字化矩陣,并作為常量數(shù)組存儲為SAMPLE_ARR[10],如0、3的樣本在模型中SAMPLE_ARR[0]、SAMPLE_ARR[3]的存儲形式如圖 3所示:
圖3 數(shù)字0和數(shù)字3在模型中的存儲形式
②程序識別流程如下
1.開始;
2.初始化樣本矩陣SAMPLE_ARR[10];
3.抓取攝像頭場景,并存儲為臨時圖片tmp.jpg;
4.主線程暫停,拋出新線程;
5.對tmp.jpg進行預處理和初步裁剪,得到res.jpg;
6.掃描關(guān)鍵像素點,如果無關(guān)鍵像素點,或像素點過少,則認為原始圖像不符合要求,返回2重新抓取場景;
7.對res.jpg進行二值化處理并縮放到適當尺寸;
8.得到待識別的像素數(shù)字化矩陣res_arr[0]-res_arr [17];
9.循環(huán)將得到的數(shù)字化矩陣與樣本矩陣進行對照,設定一個閾值范圍,如果相同像素點超過80%,即認為是對應的數(shù)字,如果10個樣本均不符合,認為本次識別失敗,返回2重新抓取場景;
10.如果18個數(shù)字均成功識別,則將識別出的18位數(shù)字組拼成身份證號采用身份證識別正則表達式進行驗證;
11.如果未通過驗證,認為本次識別失敗,返回2重新抓取場景;
12.如果通過驗證,則彈出對話框供用戶核對,流程結(jié)束。
以上過程流程圖如圖4所示。
圖4 識別身份證號碼App程序流程
1.2系統(tǒng)關(guān)鍵技術(shù)實現(xiàn)
(1)樣本矩陣的構(gòu)造
通過程序獲取10個二值化樣本圖像寬高像素值分別為 width,height,初始化三維整型數(shù)組 SAMPLE_ARR[10][width][height],掃描10個二值化樣本圖像,白點存為1,黑點存為0,將SAMPLE_ARR按數(shù)組格式輸出到文件,以備使用。
(2)圖片循環(huán)采集
因為是自定義的預覽窗口,所以不能使用Android自帶的拍照API,需要自己定義一個接口完成取景拍攝之后的動作,此接口在系統(tǒng)拍完照后調(diào)用,接口實現(xiàn)代碼如代碼1所示:
代碼1調(diào)用Android拍照API回調(diào)方法
③圖像預處理
首先,將原始圖像進行縮放至600px×400px,以提高處理性能。
其次,調(diào)整圖像亮度和對比度,以便于下一步圖像二值化時程序比較容易處理。
基本原理:圖像亮度本質(zhì)上是指圖像中每個像素點的亮度,每個像素的亮度指RGB值的大小,RGB值為0的像素點為黑色,RGB均為255的像素點為白色。對比度則是不同像素點之間的差值,差值越大,對比度越明顯。從直方圖分析的觀點來看,對比度越好的圖片,直方圖曲線會越明顯,分布也越均勻。
算法流程:調(diào)整圖像亮度與對比度算法主要由以下幾個步驟組成:
1.計算圖像的RGB像素均值M
2.對圖像的每個像素點減去平均值M 3.對去掉平均值以后的像素點P乘以對比度系數(shù)4.對步驟3處理以后的像素P加上M乘以亮度系數(shù)
5.對像素點RGB值完成重新賦值
通常,對比度系數(shù)的最佳取值范圍在[0-4],亮度系數(shù)的最佳取值范圍在[0-2]之間,本文分別取值1.5和1.0。
④圖像二值化
掃描像素矩陣,取得每一個像素點的R、G、B顏色值,如果同時滿足R<180、G<180、B<180(180為實驗值),則將此像素點置為黑色,即0xFF000000,否則置為白色,即0xFFFFFFFF。程序關(guān)鍵代碼如代碼2所示:
代碼2二值化像素點方法
⑥身份證號碼有效性驗證
如果18個數(shù)字識別完成后,App會對此號碼有效性進行驗證,確保識別出的號碼為有效的身份證號,以增加識別成功率。驗證身份證號碼有效性可以通過正則表達式完成,關(guān)鍵代碼如代碼4所示:
代碼4驗證身份證號碼有效性方法
public boolean isIdcardNumber(String idcard){
return idcard==null||"".equals(idcard)?false: Pattern.matches( "(^\d{15}$)|(\d{17}(?:\d|x|X)$)",idcard);
}
通過對多個身份證樣本在不同場景下的識別測試,發(fā)現(xiàn)在光線較好,拍攝角度比較正時能夠比較快速和正確地識別出身份證號,對于較小角度的旋轉(zhuǎn)也基本能夠正確識別身份證號,在光照條件較差或拍攝角度偏差較大時,識別正確率較差。
識別失敗結(jié)果分析:本文所設計的App在于識別身份證號的實時性,不追求一次性識別的準確性,所以并未考慮圖像旋轉(zhuǎn)角度較大的情況處理,不過對于此種情況并不影響應用的實際使用,因為對于App而言,一次識別的周期很短,如果識別失敗App會馬上進入第二次場景抓取和識別循環(huán),如果超過一定時限將提示用戶調(diào)整取景角度,并在取景界面顯示取景框,提示用戶對焦。只要用戶按照提示保正較為平正的取景,基本能夠正確識別。
本文設計并實現(xiàn)了Android平臺上基于像素匹配的身份證號碼實時識別的應用,并能夠通過打包成jar文件的方式輕易地集成到其他具體的Android項目中去,提高App中身份證號碼輸入的快速性和準確性,增強App用戶體驗。本設計十分輕巧,未使用任何第三方圖像支持庫,基本不會增加具體項目的體積。整體實現(xiàn)所使用的技術(shù)也不多,僅僅用到了Java基本的圖像操作和數(shù)組操作,對于普通開發(fā)人員易于上手,甚至可以十分輕易地通過Objective C或Swift語言改寫成iOS平臺應用,或?qū)⒃创a嵌入到桌面應用程序中,具有較強的實用性和普適性。
[1]Alsuwailem A M.A Novel FPGA Based Real-time Histogram Equalization Circuit for Infrared Image Enhancement[J].Active and Passive Electronic Devices,2008(03):311-321.
[2]Zhou S M,Gan J Q,Xu L D,et al.Interactive Image Enhancement by Fuzzy Relaxation[J].International Journal of Automation and Computing,2007,04(3):229-235.
[3]孫夑華.數(shù)字圖像處理:Java編程與實驗[M].北京:機械工業(yè)出版社,2011.
[4]劉持標,林金發(fā),孫麗麗,吳美瑜,邱錦明.基于 Android圖像識別技術(shù)的失蹤人員管理系統(tǒng)開發(fā)[J].三明學院學報,2014.8(4), 17-24.
[5]梁福林,馮生強,馬思思,石華,唐瓊.“隨手拍”物品信息查詢系統(tǒng)應用設計與實現(xiàn)[J].教育教學論壇,2015.9(39),238-239.
[6]CSDN.Java圖像處理之調(diào)整亮度與對比度[EB/OL].http://blog.csdn.net/jia20003/article/details/7385160.2012.3.22
Android;Image Recognition;Identification Card Number;Real-Time
Real-Time Recognizing Identification Card Number Based on Pixel Matching on Android Platform
CHENG Xi-wu,LI Xu-wei,ZHANG De-jiang,LIU Yuan-zhi
(College of Computer Science,Sichuan University,Chengdu 610065)
程習武(1985-),男,湖北天門人,在讀碩士研究生,助理工程師,研究方向為面向設計與制造的軟件工程
李旭偉(1963-),男,浙江長興人,副教授,研究方向為計算金融
張德江(1986-),男,新疆烏魯木旗人,在讀碩士研究生,助教,研究方向為信息安全
劉元梓(1984-),男,重慶人,在讀碩士研究生,助教,研究方向為信息安全
2015-12-15
2016-01-10
利用圖像識別技術(shù)中最基本的像素匹配技術(shù),通過限制圖像采集條件來進行循環(huán)采集識別的方式,設計并實現(xiàn)Android平臺上基于像素的實時識別身份證號碼的App應用,該應用能夠非常容易地集成到其它Android項目,以提高身份證號碼輸入的快速性和準確性,增強App用戶體驗。同時,該設計十分輕巧,未使用任何第三方圖像支持庫,可以很容易地使用Objective C語言或Swift語言改寫之后集成到iOS平臺應用中。而且該設計基本不會增加App項目的復雜度和體積,對于普通開發(fā)人員來說,易于理解和上手,對智能手機硬件配置無特殊要求,具有較強的實用性和普適性。
Designs and realizes an Android application which can recognize identification card number real-time,with the technology of pixel matching which is the basis of image recognition,by limiting the image acquisition conditions and cycling collect to recognize.And the App can very easily be integrated into other Android projects to improve the speed and accuracy when inputting identification numbers, which will enhance user experience for applications.Meanwhile,the design is very light,without any third-party image supporting libraries,which can be integrated into the iOS platform very easy by rewriting with Objective C language or Swift language.It is practical and universal,which will not increase the complexity of App,can be learn and understand easy for average developer,and non-specially requiring for smart phone hardware.