基于stm32的車牌識(shí)別設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
系統(tǒng)介紹
使用STM32F103RCT6作為主控,攝像頭使用OV7670(帶FIFO)。STM32進(jìn)行了16倍頻。識(shí)別過(guò)程分別為:圖像采集,二值化,識(shí)別車牌區(qū)域,字符分割,字符匹配。
識(shí)別過(guò)程分析
1.圖像采集:
通過(guò)OV7670攝像頭進(jìn)行圖像采集,采集的圖像大小為320*240像素,像素格式為RGB565。每個(gè)像素由兩字節(jié)組成,第一字節(jié)的高五位是Red,第一字節(jié)的低三位和第二字節(jié)的高三位組成Green,第二字節(jié)的低五位是Blue。
2.二值化:
二值化就是讓圖像的像素點(diǎn)矩陣中的每個(gè)像素點(diǎn)的灰度值為0(黑色)或者255(白色),讓整個(gè)圖片呈現(xiàn)出只有黑色和白色的效果。二值化后的圖像中灰度值范圍是0或者255。
怎樣讓像素點(diǎn)的灰度值轉(zhuǎn)為0或者255?假如灰度值為220的一個(gè)像素點(diǎn),二值化后應(yīng)該為0還是255?這時(shí)候需要設(shè)定一個(gè)閾值來(lái)對(duì)像素點(diǎn)進(jìn)行設(shè)置。
常用二值化方法:
1、取中值
設(shè)置閾值為127,灰度值小于127的為0,大于127的為255。這樣設(shè)置計(jì)算量小,計(jì)算快。缺點(diǎn)也嚴(yán)重:在不同的圖像中,顏色分布差別大,處理效果也不會(huì)很好。
程序開始之前設(shè)置R,G,B的閾值,通過(guò)閾值判斷將像素設(shè)置為全黑(0x0000)或者全白(0xFFFF).同時(shí)根據(jù)色彩的變化記錄每一行的顏色跳變點(diǎn),由此識(shí)別出車牌區(qū)域。
2、取平均值
像素點(diǎn)平均值 = (像素點(diǎn)1灰度值 + 像素點(diǎn)2灰度值 + …… + 像素點(diǎn)n灰度值) / n
3、雙峰法
此方法適用于具有明顯雙峰直方圖的圖像,不適合直方圖中雙峰差別很大或雙峰間的谷比較寬廣而平坦的圖像。該方法認(rèn)為圖像由前景和背景組成,在灰度直方圖上,前景和背景會(huì)形成高峰,在雙峰之間的最低谷處就是閾值。
3.識(shí)別車牌區(qū)域:
根據(jù)上一步的二值化,由于車牌區(qū)域跳變點(diǎn)多,由此可以得出車牌區(qū)域。分別記錄車牌區(qū)域的上下高度。然后通過(guò)RGB-HSV顏色轉(zhuǎn)換,識(shí)別出車牌區(qū)域的左右邊界。
4.字符分割:
我國(guó)常見車牌以及排列順序大部分都是按照如下設(shè)計(jì)的:漢字、英文字母、點(diǎn)、英文字母、阿拉伯?dāng)?shù)字、阿拉伯?dāng)?shù)字、阿拉伯?dāng)?shù)字、阿拉伯?dāng)?shù)字?;谶@個(gè)規(guī)律,以及圖像采集高度一致,設(shè)計(jì)了如下的分割方法:
1、在內(nèi)存中開辟七個(gè)長(zhǎng)為車牌長(zhǎng)的七分之一和寬為車牌寬的區(qū)域
2、從車牌圖像長(zhǎng)邊的巾問(wèn)向下開始掃描車牌圖像,并把掃描到的所有的點(diǎn)灰度值復(fù)制到0區(qū)域的第四個(gè)區(qū)域?qū)?yīng)位置上。然后再?gòu)纳舷蛳聮呙鑴倰呙柽^(guò)這一努的左邊或右邊,直到所掃描的這一峰上的所有點(diǎn)的灰度都是0時(shí)為止,并把這一豎認(rèn)為是字符的分離處。
3、切割第五到第七個(gè)字符。方法就是,切割完了第四個(gè)字符之后,再依次掃描剩下的空間,直到所掃描的這一豎上的所有點(diǎn)的灰度值不全為0時(shí),認(rèn)為是字符的開始并依次掃描直到所掃描的這一豎上的所有點(diǎn)的灰度值全為0時(shí)認(rèn)為是字符的結(jié)束。
4、切割第三到第四個(gè)字符。這兩個(gè)字符的切割方式與第五到第七個(gè)字符一樣。
5、切割第一到第二個(gè)字符。當(dāng)?shù)谌齻€(gè)字符切割完之后,我們將遇到一個(gè)點(diǎn),我們也把它看作一個(gè)字符,只不過(guò)這個(gè)點(diǎn)掃描之后就不要了。掃描完這個(gè)點(diǎn)之后,我們來(lái)切割第二個(gè)字符,它的切割方式與前面一樣。切割完了第二個(gè)字符之后,再向左掃描,直到所掃描的這一豎上的所有點(diǎn)的灰度值不全為0時(shí),認(rèn)為是字符的開始,并依次掃描直到所掃描所有剩下的,并填到相應(yīng)的位置,直到剩下的空間填滿。經(jīng)過(guò)粗分割后,可以得到一些單個(gè)字符區(qū)域和多余的空間。下一步我們將把這些多余的空間去掉。這將更有利于下一步字符的識(shí)別。
去除圖像上多余空間:
車牌上的字符經(jīng)過(guò)了粗切割所得到的是一些單的字符,但在分配空間時(shí)是按照車牌的寬和長(zhǎng)的七分之一來(lái)分配的;所以這個(gè)空間可能大于字符應(yīng)該占的空問(wèn)。所以,要將多余空間去除。對(duì)于第一個(gè)字符從第一行開始向下掃描,把那些一行中所有的點(diǎn)的灰度值全為0的點(diǎn)去掉,直到掃描到有一行不全為0時(shí)為止。然后再?gòu)牡谝涣虚_始向右掃描把那些一列中所有的點(diǎn)的灰度值全為0的點(diǎn)去掉,直到掃描到有一列不全為0時(shí)為止。接下來(lái)從最后一行開始向上掃描,把那些一行中所有的點(diǎn)的灰度值全為0的點(diǎn)去掉,直到掃描到有一行不全為0時(shí)為止。最后從最后一列開始向左掃描把那些一列中所有的點(diǎn)的灰度值全為0的點(diǎn)去掉,直到掃描到有一列不全為0時(shí)為止。重復(fù)上面的步驟完成剩下字符的切割
根據(jù)二值化的結(jié)果,以及記錄的跳變點(diǎn)位置,對(duì)字符進(jìn)行分割,同時(shí)記錄字符的左右邊界。
5.字符匹配:
對(duì)分割出來(lái)的字符進(jìn)行歸一化處理,這里用到圖片的擴(kuò)大算法,擴(kuò)大之后逐一的去進(jìn)行字符匹配。字符模板事前通過(guò)字模軟件轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)保存在數(shù)組中。最后根據(jù)匹配結(jié)果相似度最大的做為輸出結(jié)果。
歸一化圖像就是要把原來(lái)各不相同的字符統(tǒng)一到同一尺寸。因?yàn)閽呙柽M(jìn)來(lái)的圖像中字符大小存在較大的差異,而相對(duì)來(lái)說(shuō),統(tǒng)一尺寸的字符識(shí)別的標(biāo)準(zhǔn)性更強(qiáng),準(zhǔn)確率自然也更高。具體算法如下:先得到原來(lái)字符的高度和寬度,與系統(tǒng)已存字模的數(shù)據(jù)作比較,得出要變換的系數(shù),然后根據(jù)得到的系數(shù)按照插值的方法映射到原圖像中。