????(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程文件請關注知識星球:成工fpga,https://t.zsxq.com/DMeqH,關注即送200GB學習資料,鏈接已置頂!)
上篇我們輕松實現了車牌定位的預處理,得到的最終預處理圖片如下所示。注意一下,本工程是要求測試的圖片要盡可能是正的,不要斜,如果是斜的圖片,實際處理的過程中要先進行各種校正,至于如何校正不是本文的重點。
得到如上預處理的圖片,如何進行車牌邊界的定位呢?其實很明顯,車牌的邊界應該都是連續和相對連續的橫線或者豎線,所以我們分別對每行或者每列的圖像值為1的點進行求和存儲,最后再對前后行存儲的數據和進行比較,變化大于設定閾值的行或者列就是車牌的邊緣。
在\src\plate_location文件夾下新建horizontal_location.sv文件,完成車牌上下邊界的定位。首先完成每行圖像數據值的疊加(不是0就是1,就是一行所有像素點求和),并保存到數組ram中。
在圖片的最后一行,將前面每行求和的數據從數組ram中一一讀出來。
用ud_edge_flag信號來標示上下邊界,ud_edge_flag==0時,ram前后兩行數據的變化大于閾值THRESHOLD,那就是上邊界(反映在圖片上是下邊界,應用bmp圖像是從下往上);如果ud_edge_flag==1,ram前后兩行數據的變化大于閾值THRESHOLD,那就是下邊界。
最后對上下邊界進行適當的調整,這個根據實際情況來,一般邊界也不是1行,調整是為了在邊界線的中間位置。
完成上下邊界的定位,那就開始左右邊界的定位,在\src\plate_location文件夾下新建vertical_location.sv文件,思路和求上下邊界基本一致。首先將每列的數據分別相加后存放人數組ram中。
在圖片的最后一行,將前面每=列求和的數據從數組ram中一一讀出來。這兒為了解決圖片稍微傾斜的問題,取相鄰的五列ram數據進行疊加。
用lr_edge_flag信號來標示左右邊界,lr_edge_flag==0時,ram前后多列數據的變化大于閾值THRESHOLD,那就是左邊界;如果lr_edge_flag==1,ram前后多列數據的變化大于閾值THRESHOLD,那就是右邊界。
最后對左右邊界進行適當的調整,這個也是根據實際情況來。
完成車牌上下左右邊界的初步定位,還需要進一步的調整,在\src\plate_location文件夾下新建plate_boarder_adjust.sv模塊,主要完成車牌比例調整,檢測邊界是否有效等功能,并將車牌定位的區域縮到字符的區域,這個模塊成工基本沒有進行太大的改動。
在\src\plate_location文件夾下新建plate_location模塊,完成目前所有模塊的集成,如下所示。
完成車牌和字符邊界的定位,我們要把定位的信息反應在圖片上,也就是在圖片上將車牌的位置標出來,看看對不對,在\src\plate_location文件夾新建location_out.sv模塊,用來將車牌定位和字符定位的信息反應到原圖片上,也就是進行疊加。思路也是非常的簡單,找到要畫線的區域,用固定的顏色標出來即可。
在下一個initial塊中,完成兩幀圖片的保存。
打開img下的output文件夾,可以看到車牌邊界的定位和字符區域的定位。