1. 程式人生 > >基於OpenCV的車牌識別系統之二 ——字元分割與識別

基於OpenCV的車牌識別系統之二 ——字元分割與識別

基於OpenCV的車牌識別系統之二——字元分割與識別

車牌定位完之後就是車牌的字元識別,字元識別又分為字元分割和字元識別。字元分割的步驟採用OpenCV中尋找外輪廓函式,並根據字元輪廓在車牌影象上分割出字元影象。字元識別採用三層神經網路。本程式中採用OCR最常見的特徵提取方法:首先將每個字元歸一化為20*20的字元,然後在每個字元中提取出一個1*440的特徵向量,這440個特徵中400為統計每行和每列的畫素值個數並儲存到新的資料組中,採用minMaxLoc得出資料組中最大的畫素值,然後這個資料組中每個畫素除此這個值。40為20行和20列統計的非零畫素值得個數。這就是特徵向量的結構解析。知道這個特徵向量是怎麼來的,這樣就可以寫自己ANN離線訓練的資料集了。

本程式最初的方法也是採用的書上--《深入理解Opencv實用計算機視覺專案解析》的字元分割方法,首先得到一張車牌圖片,然後根據最大類間法(Otsu)得到一張較好的車牌二值化影象,之後採用findCounters尋找最外圍輪廓並計算其最小外接矩形的大小--這些輪廓所包圍的區域全部最為粗選的字元備選區域。然後將這些備選區域依次送入字元驗證函式(下面單獨介紹字元函式),當統計的通過字元驗證函式有且只有7個字元時,則進行下一步—在原圖上裁剪出字元區域。得到字元區域之後採用直方圖均質化等等預處理。然後依次對7個字元排序,最後在將每個字元歸一為20*20的影象。字元識別使用ANN演算法採用三層神經網路,輸入層經元數是離線訓練資料集的行數,隱含層的神經元個數是20,輸出層的神經元是類別的種類數。然後依次對每個字元運用ANN.predict函式得出1*類別數的資料組(資料組中是記錄這個字元跟每個類別的“相似度”),使用minMaxLoc函式才找出最大概率的類別。返回其位置。根據返回資料打印出字元。但是這個程式前提的是要能精準的找到車牌位置,但是例項中很難精準的找到車牌位置。其系統結構圖如圖下所示:

                                                     

該系統在實際的實現的過程中存在有幾個問題:

1.      車牌的二值化影象邊框和柳釘沒有清除乾淨會直接影響到後續的尋找輪廓。

2.      車牌的第一個字元,各種省份漢字(例如:粵,鄂字元)根本在20*20解析度下的字元無法精確區分。

3.      車牌的第一個字元,例如川、滬等字時,字型容易分開,導致往往通不過驗證函式。

那麼怎麼解決這些問題呢?

首先第一個問題比較容易解決,但解決的效果有待進一步加強。其想法是對車牌二值化影象行和列掃描。當行掃描時跳變小於某個閾值時,則認為這行資料中不包含字元資訊,這行的畫素直接置0。這樣去除掉上、下邊框和鉚釘的影響。當掃描完行之後,直接在前端和末端抹掉兩列(經驗值)資訊。這是為了去掉左右邊框的影響。左圖為含有邊框噪聲之影象,右圖為消除邊框噪聲之後的影象,但是還有少量的噪點資訊。

                                                                                                                     

其次第二問題,這些車牌的首個漢字怎麼解決,本程式是採用雙ANN,將漢字分為一類,字母和數字為一類。分別使用神經網路模型,這樣有效的提高了對漢字的識別率。作者在後期過程中對漢字字元處理的時,將其歸一為40*40的解析度,其效果也不是很理想。其原因是在原始影象中,字元的資訊只有20*20畫素,將其放大到40*40也是線性插值。如果想進一步提高漢字識別率,則需要更高的質量影象。

最後一個問題,由於作者C++語言水平能力有限所以這個問題也沒有得到解決,但作者翻過幾篇碩士論文篩選出兩種方法:第一種辦法是通過確定“特殊字元”來確定省份漢字的位置並直接進行擷取。特殊字元是通過第二字元在車牌中大概位置(經驗值),尋找其輪廓並畫出凸包的外接矩形,根據“特殊字元”的外接矩陣進行視窗滑動。向前滑動一個間隙尋找到省份漢字。第二種方法是通過間隙閾值來確定兩者為一個整體。這個兩個辦法,第一個方法過程雖然複雜且尋找得到的字元都會有點殘缺,但此方法對二值化的影象質量要求不高且殘缺的部分對字元識別影響較小。第二種方法對二值化後的影象質量要求較高,如果邊緣沒有處理好直接導致將第一個字元夾雜著大量的噪點資訊,這樣會在很大層度上影響到字元識別。針對以上問題我對原先的程式進行修改。這三張圖片是我的實驗結果截圖:

    

PS:字元驗證函式幾乎是根據先驗條件得到的,但是這裡為什麼不能用到先驗條件呢?在我國的車牌上字元是比例是45/90,但這個比例是在圖片正常的前提下。前面的文章將得到的車牌歸一化為33*144,這樣至多至少的已經將圖片進行壓縮或放大,且是不等比例的壓縮或放大。這樣字元比例已經不能作為的篩選條件。作者根據影象比例(實際的除錯過程中的經驗),設定字元的高度應在15-25個畫素之間。本來想設定其字元寬度與高度之比,但是字元的寬度相差很大,例—字元為“1”時其寬度為3個畫素值。故此這個驗證函式的篩選條件還有待進一步的商榷。這個是值的改進的地方。調整期車牌的大小,具體根據攝像頭定點拍攝時,車牌在影象中所佔的畫素個數來決定的。

程式碼:http://download.csdn.net/detail/chengchaopeng520/9808253