張軍平,徐衍勝
(1. 蘭州交通大學(xué) 研究院,蘭州 730070;2. 山西軍躍邁科信息安全技術(shù)有限公司,太原 030006)
隨著我國社會的迅猛發(fā)展,城市交通事業(yè)發(fā)展也隨之步入快節(jié)奏,車輛監(jiān)控和車輛自動識別成為焦點問題.其中車牌識別技術(shù)作為智能交通中最重要的部分之一,一直是國內(nèi)外學(xué)者們研究計算機(jī)視覺的熱門問題.各種道路卡口、停車場出入等場所都已應(yīng)用了車牌識別技術(shù),為城市交通智能化提供全方位信息化支撐[1-2].近年來,國內(nèi)外對復(fù)雜環(huán)境下的車牌識別技術(shù)的研究成為熱點,BP神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)等深度學(xué)習(xí)算法在其中的應(yīng)用取得了較好的識別效果[3-4].隨著移動應(yīng)用的不斷推廣,在手機(jī)上實現(xiàn)車牌識別已成為一個重要的應(yīng)用方向,許多學(xué)者進(jìn)行了相關(guān)研究[5-6].但是,基于手機(jī)拍攝的圖片,尤其是在運動過程中拍攝的圖片,具有拍攝易抖動、角度易偏差的特點,當(dāng)前的各項車牌識別技術(shù)應(yīng)用在手機(jī)上,尤其是手機(jī)與車輛相對運動的場景中,其效率或準(zhǔn)確率達(dá)不到實用要求.基于此背景,本文在手機(jī)最常用的操作系統(tǒng)Android平臺下,提出一種基于OpenCV的車牌號自動識別方法.
本文的設(shè)計基于以下兩個約束條件:1) 基于Android平臺;2) 手機(jī)與車輛處于相對運動狀態(tài):手機(jī)可在運動過程中進(jìn)行拍攝、識別,目標(biāo)車輛同時也可處于運動狀態(tài).
為實現(xiàn)Android平臺下的圖像識別,采用OpenCV(open source computer vision library)作為圖像處理工具.OpenCV是一個基于BSD許可的開源機(jī)器視覺和機(jī)器學(xué)習(xí)庫,其包含的OpenCV for Android可利用JAVA接口將OpenCV視覺庫添加到Android的開發(fā)工具中,實現(xiàn)在移動端的圖像處理功能[6].
實現(xiàn)方法分兩步:首先利用OpenCV for Android實現(xiàn)單一車牌圖像的識別;然后在此基礎(chǔ)上增加連續(xù)拍攝、自動篩選功能,以適用于移動應(yīng)用.其流程如圖1所示.
圖1 車牌圖像識別流程圖Fig.1 Flow chart of license plate image recognition
我國機(jī)動車輛號牌,由漢字、英文字母以及數(shù)字構(gòu)成.其中,第一個字符為漢字,是各個省、直轄市、自治區(qū)、行政區(qū)的簡稱,其余的字符為英文字母或數(shù)字[6-7].由于漢字的復(fù)雜性,我國的車牌比國外要復(fù)雜得多.因此,本文中只針對我國國內(nèi)的車牌進(jìn)行識別設(shè)計.車牌圖像一般具有以下特征:
1) 車牌一般為矩形,位于車身底部,其周圍沒有明顯的、與其相似的矩形區(qū)域.
2) 車牌的字符大小相同,個數(shù)基本固定,并且字符之間的間隔相同.
3) 字符與背景色反差較大.根據(jù)車型的不同,車牌具有多種顏色組合,如藍(lán)底白字、黃底黑字、黑底白字,以及近年來新能源車輛的白底綠字等,其顏色反差均十分明顯.
根據(jù)車牌圖像的特征,其識別過程可分為5個步驟:圖像獲取、圖像預(yù)處理、車牌定位、字符分割和字符識別.
利用OpenCV for Android的CvCameraViewListener2接口可從手機(jī)攝像機(jī)獲取圖像.需自定義一個Activity,并實現(xiàn)CvCameraViewListener2接口.在方法onCameraFrame(CvCameraViewFrameinputFrame)中,其參數(shù)inputFrame即為當(dāng)前圖像幀.利用inputFrame.rgba可得到初始圖像,如圖2所示.
圖2 初始圖像Fig.2 Initial image
圖像預(yù)處理是對輸入的初始圖像進(jìn)行處理,用以去除圖像的噪聲,并體現(xiàn)其邊緣特征.其過程分為2步:灰度化和邊緣檢測.
1) 灰度化
OpenCV for Android提供了cvtColor函數(shù),可實現(xiàn)色彩空間的轉(zhuǎn)換.采用CV_RGB2GRAY參數(shù),可以將輸入的初始圖像轉(zhuǎn)換為灰度圖像.其轉(zhuǎn)換公式為:Y=0.299R+0.587G+0.114B.其中:Y是灰度值;R、G、B分別為初始圖像紅、綠、藍(lán)通道的顏色值,其值范圍全部為0~255.轉(zhuǎn)換為灰度圖像以后,還需要進(jìn)行平滑和高斯濾波處理,以消除噪聲,可采用cvSmooth函數(shù)來實現(xiàn).灰度化結(jié)果如圖3所示.
圖3 灰度圖Fig.3 Gray image
2) 邊緣檢測
車牌圖像為矩形,而且其區(qū)域顏色反差較大,反應(yīng)在灰度圖上則是其灰度值跳變較大.因此,可以通過邊緣檢測來凸顯其特征.常見的經(jīng)典邊緣檢測算法有Roberts算子、Sobel算子、Log算子、Canny算子、Laplacian算子以及Prewitt算子等[8-9].這些算法都利用了邊緣處灰度值的變化跳變來進(jìn)行檢測.其中,Canny算子分為高斯濾波、梯度值計算、非極大值抑制、滯后邊界跟蹤等過程,具有不易受噪聲干擾、能夠檢測真正的弱邊緣的特性,比較適用于車牌圖像邊緣檢測的場景.OpenCV for Android中提供了Canny函數(shù)來實現(xiàn)Canny算子邊緣檢測[10].Canny函數(shù)通過兩個重要參數(shù)threshold1和threshold2來設(shè)置雙閾值,以實現(xiàn)滯后邊界跟蹤:threshold1為低閾值,用于控制邊緣連接,其值可取圖像灰度值的平均值,以達(dá)自適應(yīng)的目的;threshold2為高閾值,用于控制強(qiáng)邊緣,其值可取圖像最大灰度值的70%.圖像的最大灰度值可通過CV_IMAGE_ELEM函數(shù)遍歷獲取.圖4為邊緣檢測的結(jié)果,可以看到,圖像輪廓比較清晰,噪聲較少,特別是車牌部分,可以較為完整地凸顯出來.
圖4 邊緣檢測結(jié)果Fig.4 Edge detection results
車牌定位是從邊緣檢測結(jié)果圖中找到車牌的位置,并將其從初始圖像中切割出來,作為字符分割和識別的輸入.在常用的定位方法中,有顏色定位法[11]和紋理定位法等.
顏色定位法是根據(jù)車牌顏色的特征,如藍(lán)底白字、黑底白字、黃底黑字等,通過判斷顏色的變化來定位.這種方法在車輛所處環(huán)境如光照、背景較為復(fù)雜時,準(zhǔn)確率較低.
紋理定位法是指通過判斷紋理來定位:首先對輸入的二值圖像進(jìn)行垂直方向投影,從左至右掃描,記錄每個掃描點灰度值為255的像素點個數(shù),通過此數(shù)據(jù)的跳變數(shù)來判斷是否為車牌.我國的車牌號碼一般由7~8個字符組成,所以在車牌圖像中,跳變數(shù)至少為14個.可認(rèn)為跳變數(shù)超過一定閾值(如10)則為車牌圖像.但是紋理定位法受閾值選取的影響較大.閾值選取較小,容易造成誤判;閾值選取較大,容易造成漏判,找不到車牌位置.
本文采用了形態(tài)定位法,分兩步進(jìn)行:形態(tài)學(xué)處理和定位.
1) 形態(tài)學(xué)處理
形態(tài)學(xué)處理主要是通過圖像的閉運算和開運算來完成.圖像的閉運算是先膨脹后腐蝕的過程,可以連接鄰近物體,平滑邊界,還可以填充物體內(nèi)的細(xì)小空洞;圖像的開運算是先腐蝕后膨脹的過程,可以在較纖細(xì)的部位分離物體,消除噪聲和細(xì)小的物體,還可以平滑較大物體的邊界.
在邊緣檢測結(jié)果的基礎(chǔ)上,先做開運算,可以填平小孔,對邊緣內(nèi)部進(jìn)行填充,結(jié)果如圖5所示;然后再連續(xù)做兩次閉運算,消除圖像中的小噪點,結(jié)果如圖6所示.OpenCV for Android提供了形態(tài)學(xué)變換函數(shù)morphologyEx,通過不同的參數(shù)選擇,可以完成開運算和閉運算處理[10].處理后的結(jié)果如圖5~6所示.
圖5 開運算的結(jié)果Fig.5 Results of open operations
圖6 兩次閉運算后的結(jié)果Fig.6 Results after two closed operations
2) 定位
對車牌的精確定位可分為2步:位置提取與篩選.
步驟1:位置提取.在形態(tài)學(xué)處理完成后,從可視化角度,圖像被明確劃分為多個白色區(qū)域.這些區(qū)域包含了車牌的位置.OpenCV for Android提供了findContours函數(shù),可以在圖6的基礎(chǔ)上,完成白色區(qū)域的位置提取[11].
步驟2:篩選.采用基于顏色空間篩選的思想來區(qū)分是否為車牌[12].先用上一步提取的位置將原圖分割出來,并利用cvtColorb函數(shù)將其圖像區(qū)域轉(zhuǎn)化成HSV(hue,saturation,value)顏色空間;然后,對比各個區(qū)域顏色范圍的滿足情況,最符合藍(lán)色顏色區(qū)間的區(qū)域便是車牌所在區(qū)域,如圖7所示.
圖7 定位后的車牌圖像Fig.7 License plate image after positioning
字符分割是將定位后的車牌圖像,分割為各個獨立的字符圖像,每個圖像中有且只有一個字符.其算法采用了垂直投影[13]、輪廓分析、字符尺寸判定等技術(shù).首先將定位后的車牌圖像進(jìn)行二值化處理,將藍(lán)色底變?yōu)楹谏?,白色前景變?yōu)榘咨?;然后做垂直投影,并從左到右逐排檢查有沒有白色像素點.如果圖像兩邊都沒有白色像素點,則該區(qū)域的圖像可以認(rèn)為是一個獨立字符,可以切割出來.在切割過程中,還需要考慮一些干擾因素,如圖7中“豫U”后面的圓點.干擾可通過判斷所切割圖像的大小來識別:如果小于一個特定值,則認(rèn)為是干擾因素.考慮到車牌最多為8個字符,此特定值可以取w/9,其中,w是圖7所示的定位后車牌圖像的寬度.
分割完成后,需要對圖像進(jìn)行歸一化處理,全部縮放為寬為20像素、高為40像素的圖片.
字符識別是將分割后的圖像識別為字符的過程,可采用模板匹配的方法實現(xiàn)[14-15].首先需建立一個模板庫,模板庫中需包括車牌用到的所有字符,包括漢字、數(shù)字和英文字母;然后通過將上一節(jié)分割完成并歸一化的圖片與模板庫逐一匹配,找到最符合的模板,即可轉(zhuǎn)換為對應(yīng)的字符.
OpenCV for Android提供了模板匹配函數(shù)matchTemplat(),其思想是將模板圖像在目標(biāo)圖像上滑動逐一對比,通過統(tǒng)計的基本方法進(jìn)行匹配.該函數(shù)提供了TM_SQDIFF、TM_SQDIFF_NORME、TM_CCORR、TM_CCORR_NORMED、TM_CCOEFF、TM_CCOEFF_NORMED等6種匹配算法參數(shù),分別對應(yīng)平方差匹配、歸一化平方差匹配、相關(guān)性匹配、歸一化相關(guān)性匹配、相關(guān)性系數(shù)匹配、歸一化相關(guān)性系數(shù)匹配[10].在字符識別中,可采用TM_CCOEFF_NORMED方法,即歸一化相關(guān)性系數(shù)匹配.
利用matchTemplat函數(shù),采用歸一化相關(guān)性系數(shù)匹配法進(jìn)行模板匹配,每個字符的匹配都會自動得出一個匹配度值.該值位于區(qū)間[0,1.0]之間.值越大,其匹配效果越好.通過車牌中每個字符的匹配度值可以計算得到車牌圖像的匹配度值.以7個字符的車牌為例,在字符識別的過程中,車牌的7個字符會產(chǎn)生7個匹配度值.可取最小的一個當(dāng)作本次圖像識別的匹配度.
在實際應(yīng)用過程中,可通過連續(xù)拍攝多張圖像進(jìn)行識別,通過判斷識別結(jié)果的一致性以及匹配度,自動篩選出其中最可能的結(jié)果,作為最終結(jié)果.其過程如下:
1) 采用一定措施,保證在一定時間內(nèi)取到的圖像是同一個車牌.比如可在界面上通過人工操作來完成.
2) 在圖像獲取時,采用連續(xù)抓取圖像的方式.對抓取的每張圖片都完成上一節(jié)所述的圖像識別過程,得到車牌號和匹配度值.
3) 判斷識別結(jié)果的一致性.如果上一步得到的多個結(jié)果中,有60%以上的車牌號相同,則認(rèn)為該結(jié)果一致性較好,此時符合一致性的車牌號即為識別結(jié)果.如果達(dá)不到60%以上的車牌號相同,則認(rèn)為一致性較差.
4) 如是一致性較差,需要比較所有結(jié)果的匹配度.如果最大的匹配度大于0.7,則認(rèn)為該結(jié)果為正確結(jié)果;如果最大的匹配度小于0.7,則認(rèn)為本次沒有識別出圖像.
前文中所用的圖片從互聯(lián)網(wǎng)搜索得到,比較清晰,主要用于程序開發(fā)和調(diào)試過程.為驗證上述方法在實際應(yīng)用中的效果,在真實環(huán)境中進(jìn)行了實測.手機(jī)選用當(dāng)前略偏低的主流配置:紅米Note4X,CPU為64位八核心驍龍625處理器,內(nèi)存為4 GB,機(jī)身存儲空間64 GB,后攝像頭1 300萬像素,操作系統(tǒng)為MIUI10,安卓版本為8.0.OpenCV for Android版本為3.4.11.
共做兩個實驗,分別用于驗證單一的車牌圖像識別效果與結(jié)合自動篩選功能后的效果.兩個實驗的功能全部在同一個軟件中實現(xiàn),采用相同的樣本.
實驗樣本數(shù)據(jù)分兩組:
1) 在停車場采集靜止車輛的數(shù)據(jù):工作人員手持手機(jī),距離目標(biāo)車輛2~3 m,在正前方采集其車牌圖像.
2) 在道路上采集運動車輛的數(shù)據(jù):有一臺采集車,工作人員手持手機(jī),于車內(nèi)向后拍攝采集車牌圖像.采集車車速保持在40 km/h以內(nèi),距后方目標(biāo)車輛20 m以內(nèi),目標(biāo)車輛時速與采集車相近.
對每個樣本車輛的數(shù)據(jù)采集方式為:首先關(guān)閉自動篩選功能,拍一張照片,識別得出車牌號,并記錄,此為實驗1;然后啟用自動篩選功能,連續(xù)拍攝5 s視頻,識別得出結(jié)果,并記錄,此為實驗2.
5.3.1 實驗1
未啟用自動篩選功能,對每個車輛只采集一張圖片進(jìn)行識別,軟件采用單線程處理方式,結(jié)果見表1.
表1 實驗1結(jié)果統(tǒng)計Tab.1 Statistics of experiment 1
通過對識別錯誤的圖片分析,發(fā)現(xiàn)引起識別錯誤的原因主要有以下4個方面:
1) 車牌污損:靜止車輛樣本,未能準(zhǔn)確識別的21個樣本中,9個污損比較嚴(yán)重;運動車輛樣本,未能準(zhǔn)確識別的44個樣本中,2個樣本污損比較嚴(yán)重.
2) 光線較差:靜止車輛樣本,未能準(zhǔn)確識別的21個樣本中,14個光照較差,其中2個樣本同時具有污損現(xiàn)象且比較嚴(yán)重.
3) 拍照不清晰:運動車輛樣本,未能準(zhǔn)確識別的149個樣本中,51個樣本圖像比較模糊,其中1個樣本同時具有污損現(xiàn)象且比較嚴(yán)重.
4) 角度偏差較大:運動車輛樣本,未能準(zhǔn)確識別的149個樣本中,98個樣本由于拍攝角度問題,圖像中的車牌號形狀與矩形差別較大.
除去上述4種情況以外,車牌的識別率可達(dá)100%.
5.3.2 實驗2
與實驗1采用同樣的樣本,采用8線程并行處理,且啟用了自動篩選功能,對每個車輛采集約5 s的數(shù)據(jù),結(jié)果見表2.
表2 實驗2結(jié)果統(tǒng)計Tab.2 Statistics of experiment 2
表2中,未識別指連續(xù)拍攝的圖像中,最大匹配度小于0.7;識別錯誤指最大匹配度大于0.7,但識別結(jié)果與實際結(jié)果不同.
實驗發(fā)現(xiàn),沒有識別錯誤的結(jié)果.對未能準(zhǔn)確識別的35個樣本進(jìn)行逐一分析,發(fā)現(xiàn)其最大匹配度全部小于0.6,表明這些拍攝的圖片與模板圖片差別較大.對這些樣本進(jìn)行人工比對分析,發(fā)現(xiàn):靜止車輛樣本中的9個未識別樣本車牌污損嚴(yán)重;運動車輛樣本中的26個未識別樣本中,1個車牌污損嚴(yán)重,其余25個樣本拍攝角度偏差較大.結(jié)果表明,車牌污損與角度偏差較大是未能準(zhǔn)確識別的主要原因.
從性能角度,由表1和表2可知,在單線程模式下,對每個樣本圖片的處理速度約132 ms左右.如果采用多線程處理方式,在主流手機(jī)八核CPU環(huán)境下,8線程并行處理,可將平均處理時間縮短至20 ms以內(nèi).完全可滿足實時處理的需求.
從影響準(zhǔn)確率的角度,實驗1中由于光線較差引起靜止車輛識別錯誤的12個樣本,在實驗2中已成功識別.對比兩次實驗結(jié)果,可知車牌污損和拍攝角度偏差較大是影響結(jié)果的主要問題,而光線較差和拍攝模糊的問題可以通過連續(xù)拍攝圖像來解決.
從準(zhǔn)確率角度,對于靜止車輛,實驗2比實驗1的準(zhǔn)確率提高2.2個百分點,達(dá)到98.3%;對于運行車輛,實驗2比實驗1提高的準(zhǔn)確率提高了37.4個百分點,達(dá)到92.1%,基本可滿足實用要求.實驗結(jié)果表明自動篩選功能效果良好.
在手機(jī)上實現(xiàn)移動過程中的車牌識別是未來智能交通與移動應(yīng)用相結(jié)合的一個重要方向.本文基于OpenCV for Android,在手機(jī)上實現(xiàn)了對車牌的自動識別,并對單一的車牌圖像識別與連續(xù)拍攝自動篩選進(jìn)行了初步的研究.通過實驗和分析發(fā)現(xiàn),該方法的實時性好,準(zhǔn)確率較高,但還有進(jìn)一步提升的空間,需要繼續(xù)改進(jìn).相信在不久將來,基于手機(jī)的車牌識別技術(shù)會有更大地發(fā)展.