陸超,柯永斌
(淮陰工學(xué)院 電子信息工程學(xué)院,江蘇 淮安 223001)
在當(dāng)前的社會中,限高桿的是為了限制車輛通行的高度,用來保護(hù)橋梁、隧道等交通設(shè)施,但是現(xiàn)實生活中所使用的限高桿技術(shù)往往都是剛性的,大多數(shù)的制成材料是用金屬,因為汽車在行駛時具有很大的慣性,如果當(dāng)一個駕駛員駕駛著汽車,而沒有看到這個限高桿。很容易就會撞上去,這樣會造成很嚴(yán)重的交通事故,若只設(shè)置有檢測超高裝置的話,兩輛汽車同時經(jīng)過,不能確定是哪個車輛。所以要加上車牌識別用于提醒具體的車輛[1]。為了解決限高桿的這一不足,本課題目的就是完成一個智能限高桿提醒系統(tǒng)設(shè)計。
本課題的研究目標(biāo)是設(shè)計一款基于樹莓派車牌識別的智能限高桿。它可以判斷過來的車輛是否超過限定的高度,抓拍超過限定高度的車輛圖片,并且從中提取車牌信息,然后給予警示。樹莓派利用激光對準(zhǔn)模塊來進(jìn)行對車輛是否超出限定高度,輔以攝像頭來作為抓取車輛信息,通過python3.5和OpenCV,來對含有車牌信息的圖片在本地進(jìn)行車牌識別,通過串口發(fā)送給單片機(jī)。單片機(jī)在接收到發(fā)過來的車牌信息之后,將車牌信息顯示在點陣屏上面,不斷閃爍以警示超高司機(jī)注意安全[2]。
圖1 硬件總體設(shè)計流程圖Fig1 Hardware overall design flow chart
利用激光對射傳感器經(jīng)向檢測,若車輛超過設(shè)定的高度,則樹莓派利用攝像頭進(jìn)行抓拍,對抓拍到的照片進(jìn)行提取載入,使用OpenCV這個開源的計算機(jī)視覺庫來處理。得到車牌的相關(guān)信息,利用串口發(fā)給單片機(jī),單片機(jī)接收到信息后通過無線模塊發(fā)送給另一個節(jié)點單片機(jī),然后在LCD屏顯示該車輛的車牌信息。
圖2 軟件總體設(shè)計流程圖Fig 2 Overall software design flow chart
所要求設(shè)計的系統(tǒng)能夠利用樹莓派拍攝的照片,進(jìn)行數(shù)字圖像處理和使用一些相關(guān)算法,快速地、準(zhǔn)確地識別出車牌信息[3]。車牌識別的設(shè)計流程圖如下:
圖3 車牌識別設(shè)計Fig 3 License plate recognition design
對于圖像的邊緣檢測,我采用了 Canny算子進(jìn)行邊緣檢測。
Canny算子是一種檢測性能較好,應(yīng)用也比較廣泛的一種邊緣檢測算子。它通過圖像信號的函數(shù)的極大值來判定圖像的邊緣監(jiān)測點。
對于Canny算子的邊緣檢測的步驟如下:
消除噪聲。在Canny算子邊緣檢測之前,先要對原始數(shù)據(jù)和高斯模板進(jìn)行卷積,將得到的圖像與最初的圖像比較又模糊,一般來說采用高斯平滑濾波器來鏡像卷積降噪,下面是一個size = 5的高斯內(nèi)核[4]:
計算圖像的梯度幅度和它的方向??梢圆捎靡浑A差分來對圖像灰度的梯度值求取近似。求得圖像在x和y方向的頻道書,用一堆卷積陣列分布作用于相應(yīng)的水平核垂直方向。Canny算子使用的Sobel模板如下[5]:
從上面的式子可以求出卷積后的結(jié)果求出的近似梯度幅度為G:
圖4 邊緣檢測變換圖Fig 4 Transformation diagram of edge detection
本系統(tǒng)是整個系統(tǒng)設(shè)計的核心部分,主要的控制環(huán)節(jié),分析環(huán)節(jié),處理環(huán)節(jié)都在本部分完成。下位機(jī)僅僅起到一個顯示的作用。
本系統(tǒng)主要分為4個部分,分別是車輛高度判斷部分、圖像采集部分,車牌識別部分、通信部分。
系統(tǒng)主要分為圖像采集,預(yù)處理,車牌定位,字符分割以及最后的車牌識別部分[6]。首先利用攝像頭進(jìn)行圖像的采集,然后對采集的圖像進(jìn)行一系列的處理,如灰度變換等等。接著進(jìn)行車牌定位,確定車牌所在的圖像區(qū)域。最后對含有車牌的矩形區(qū)域進(jìn)行字符分割。將每個分割出來的字符進(jìn)行模板匹配最后得到車牌信息,完成車牌識別這個流程。
圖5 識別流程圖Fig 5 Identification flowchart
為了能確保樹莓派能夠正常的運行程序,應(yīng)該配置樹莓派的GPIO引腳,串口,以及載入已經(jīng)訓(xùn)練好的SVM模板。初始化流程如圖6所示:
圖6 統(tǒng)初始化流程圖Fig 6 Series initialization flow chart
車輛高度判斷是基于激光對射模塊的,激光對射模塊安裝在固定的高度,若有超過高度的物體通過,則電平會發(fā)生變化,此時樹莓派不斷讀取相應(yīng)的GPIO管腳的電平值來判斷。
當(dāng)確定有車輛超過限定高度的時候,才執(zhí)行攝像頭,車牌識別等步驟。
第一種的方法是基于圖像的邊緣來進(jìn)行檢測,也就是如上面所提到的例如Canny邊緣處理算子,拉普拉斯算子等。第二種是基于車牌的顏色來進(jìn)行判斷的,車牌的長寬比是固定的所以可以確定車牌所在的區(qū)域。車牌定位的流程如圖7所示:
圖7 車牌定位流程圖Fig 7 License plate location flow chart
因為含有車牌的圖像如果傾斜的話,不利于圖像的分割。所以它的角度必須被調(diào)整到能夠分割出比較完整地字符為止,調(diào)整車牌的傾斜度可以令所有的字符基本上處于水平狀態(tài)。這有利于對字符之間的分割,間接的提升了車牌識別的準(zhǔn)確程度。經(jīng)過對算法方面的不斷調(diào)整,在于查找水平直方圖波峰的分布,峰圖越密,認(rèn)為是水平方向,最大的波峰為車牌區(qū)域。那塊區(qū)域的是字符的可能性越大。查找查找垂直直方圖波峰,圖像在水平像素位置附近,若字符兩側(cè)的像素的平均值有相當(dāng)大的起伏,則它顯示的圖像存在傾斜,需要進(jìn)行修正[7]。找到含有車牌的區(qū)域之后,要判斷是否傾斜,如果傾斜的角度過大的話對接下來的字符分割以及字符識別會進(jìn)行干擾,所以此時要進(jìn)行角度校正。角度矯正的部分代碼如下:
下面需要計算每個像素點的平均高度,圖像的左半邊的像素點,圖片右半邊的像素點,從這些數(shù)據(jù)中中找到圖像的斜率,圖像重建的斜率,包括一個新的圖像輸出到圖像像素映射時間。使用hough來檢測直線,從而檢測出角度。最后再利用一些相關(guān)的旋轉(zhuǎn)算法,將剛才旋轉(zhuǎn)的車牌進(jìn)行旋轉(zhuǎn)。車牌的傾斜度調(diào)整后的效果如圖8所示:
圖8 調(diào)整后的效果圖Fig 8 The adjusted effect diagram
車牌的字符主要進(jìn)行單字符的分割,主要策略就是主要來檢測像素的綜合變化,字符的顏色與非字符區(qū)域的顏色完全不同,經(jīng)過二值化之后的非字符區(qū)域就是黑色,像素的值比較低[8]。含有字符的區(qū)域白色點比較多,所以含有字符的列的像素和比較高。根據(jù)這個來進(jìn)行字符分割。
具體分割的算法如下:
(1)認(rèn)為水平方向,最大的波峰為車牌區(qū)域。
(2)查找垂直直方圖波峰,去掉車牌上下邊緣1個像素,避免白邊影響閾值判斷。
(3)U和0要求閾值偏小,否則U和0會被分成兩半,車牌字符數(shù)應(yīng)大于6,判斷是否是左側(cè)車牌邊緣。組合分離漢字,去除車牌上的分隔點,可能是固定車牌的鉚釘,判斷最后一個數(shù)是否是車牌邊緣,假設(shè)車牌邊緣被認(rèn)為是1。
車牌字符分割的示意圖如9所示:
圖9 字符分割示意圖Fig 9 Character segmentation diagram
該步驟如下:首先要做的是判斷車牌的字符數(shù)是否大于6,緊接著判斷車牌左側(cè)的邊緣,接著分離出第一個漢字部分[9]。去掉車牌上的分隔點,將剩下的字符一個個分割,判斷最后一個數(shù)是不是邊緣,假設(shè)邊緣為1,若這個1太細(xì)的話則把它當(dāng)做是邊緣來處理。
將上面含有字符圖片所分割出來的字符串圖片,對它做一個個的字符分割,將每個字符串送到已經(jīng)訓(xùn)練好的模板里進(jìn)行識別。需要對模板進(jìn)行訓(xùn)練,將34省的縮寫,以及0到9這十個數(shù)字和A-Z這26個字母進(jìn)行訓(xùn)練。但是因為沒有足夠的樣本,無法進(jìn)行這一步的操作。
使用樣本上的一些限制還有由于樣本的不足,算法方面也有待完善。導(dǎo)致在車牌定位方面有些不準(zhǔn)確,遇到環(huán)境復(fù)雜或者車牌占比很小識別不出來。在字符中樣本的不足,在判斷兩個字符的情況下,會導(dǎo)致混淆,如0和O以及Z與2,還有就是8和B等等。這些都需要很大的樣本來訓(xùn)練,以提高準(zhǔn)確率。
警示系統(tǒng)使整個系統(tǒng)的限高警示部分,是主要的輸出信息環(huán)節(jié),展示環(huán)節(jié)。
本系統(tǒng)主要分為兩個部分,分別是串口通信部分,車牌信息顯示部分。樹莓派在往單片機(jī)發(fā)的時候,以GB2312的格式發(fā)送[10]。在GB2312格式中,每個中文字符占據(jù)兩個字節(jié),英文占據(jù)一個字節(jié)。將得到的車牌信息顯示在戶外點陣屏幕上面上面。
圖10 車牌示警部分流程圖FIig 10 Flow chart of license plate warning part
通信協(xié)議以‘#’為起始幀,以‘%’為結(jié)束幀,防止數(shù)據(jù)在傳輸?shù)倪^程中出現(xiàn)亂碼或者錯碼,提高了系統(tǒng)的可靠性。車牌含有一個中文字符,七個英文或者數(shù)字,定義了一個9個字符的數(shù)組。協(xié)議的示意圖如下:
圖11 自定義協(xié)議圖Fig11 Custom Protocol diagram
本文詳細(xì)的介紹了辨識部分的車牌識別本地化處理的過程,以及警示部分的處理。利用SVM支持向量機(jī)實現(xiàn)對字符的訓(xùn)練以及處理,最后還介紹了辨識部分與警示部分之間的通信協(xié)議.