楊蒙蒙,鄧三星,劉越奇,李克強(qiáng),呂勇杰
(黃河交通學(xué)院 河南省智能制造技術(shù)與裝備工程技術(shù)研究中心,河南焦作,454950)
隨著中國汽車數(shù)量逐年增加,智能交通成為當(dāng)前科研研究的熱點(diǎn),其中人工智能技術(shù)和圖像識別技術(shù)得到快速發(fā)展。車牌智能識別技術(shù)在智能停車場收費(fèi)管理、小區(qū)門禁管理等領(lǐng)域有廣泛的應(yīng)用[1~2]。通過單片機(jī)控制技術(shù)和圖像識別技術(shù)結(jié)合,設(shè)計(jì)一種基于OpenMV的車牌識別系統(tǒng),通過OpenMV 模塊進(jìn)行車牌圖像準(zhǔn)確識別,并能夠進(jìn)行語音播報(bào),且能通過OLED 模塊顯示車輛入場的計(jì)時(shí)提示、出場的繳費(fèi)提示,從而達(dá)到車牌識別系統(tǒng)智能控制的目的。
車牌識別系統(tǒng)的硬件部分由主控芯片STM32F103、OpenMV 模塊、OLED 顯示模塊、語音模塊以及電源等模塊構(gòu)成。系統(tǒng)通過攝像頭進(jìn)行車牌圖像采集,然后由主控芯片STM32 進(jìn)行圖像處理,輸出識別結(jié)果。單片機(jī)根據(jù)識別結(jié)果計(jì)算停車時(shí)長以及費(fèi)用,并驅(qū)動語音模板播報(bào)數(shù)據(jù),最后將檢測數(shù)據(jù)實(shí)時(shí)顯示在OLED 中。
車牌識別系統(tǒng)的單片機(jī)最小系統(tǒng)由STM32F103C8T6芯片和相應(yīng)的外圍電路組成。STM32F103C8T6 芯片是由2.0~3.6 V的直流電壓供電[3]。該芯片是STM32 系列64位引腳和128K flash,采用單線串行輸出,以及JTAG 接口方式,具極高性能、極低價(jià)格、極低功耗等優(yōu)點(diǎn)。晶振電路是單片機(jī)運(yùn)行的一個(gè)重要因素。由于晶振電路的頻率穩(wěn)定性極好,而且這類電路能有效抵御外界因素的不利干擾,所以我們通常選擇晶振電路來產(chǎn)生系統(tǒng)參考頻率。使用晶振電路產(chǎn)生的頻率可以保證其頻率精度。
STM32F103C8T6 單片機(jī)最小系統(tǒng)包含1個(gè)8MHz 晶振、2個(gè)22pF 電容等,它是維持系統(tǒng)正常穩(wěn)定運(yùn)行的基本電路。電路組成如圖1所示。
圖1 STM32最小系統(tǒng)電路圖
車牌識別系統(tǒng)的圖像識別模塊選用OpenMV,它是一款小巧,低功耗,低成本的攝像頭模塊[4],其主要應(yīng)用于機(jī)器視覺領(lǐng)域。其核心為STM32F427,在緊湊的硬件模塊上,集成OV7725 攝像頭芯片,可采用C 語言高效實(shí)現(xiàn)機(jī)器視覺算法[5]。OpenMV 使用的STM32F427 硬件資源豐富,可 提 供UART、I2C、SPI、PWM、ADC、DAC、GPIO 接口,擴(kuò)展外設(shè)功能比較方便[6]。USB 接口用于將OpenMV IDE連接到計(jì)算機(jī),以提供編程幫助、調(diào)試和固件升級。
車牌識別系統(tǒng)的顯示模塊采用OLED12864 模塊,用于車牌信息、停車計(jì)時(shí)與計(jì)費(fèi)信的顯示。OLED12864 顯示器分辨率為128×64, 屏幕尺寸為0.96 寸[7]。單片機(jī)系統(tǒng)地將控制電平信號輸入給顯示模塊中控制其顯示的內(nèi)容,且該系統(tǒng)都由這種方式將所產(chǎn)生的數(shù)據(jù)顯示在這些模塊上面。OLED12864 液晶顯示屏原理圖如圖2所示。
圖2 顯示模塊電路圖
車牌識別系統(tǒng)識別車輛車牌信息后,經(jīng)常需要在車輛進(jìn)出的時(shí)候需要播放特定的語音信息。因此本系統(tǒng)需要選擇一款性價(jià)比超級高,播放語音的音質(zhì)特別好的語音播報(bào)的模塊,系統(tǒng)通過串口控制且有4 路通道,電壓范圍8 ~24V的喇叭。語音播報(bào)模塊電路如圖3所示。
圖3 語音播報(bào)模塊電路
系統(tǒng)開機(jī)后,首先初始化數(shù)據(jù),基于STM32 和OpenMV 對車牌信息進(jìn)行相應(yīng)的識別工作。如果檢測到信號,就通過AD 轉(zhuǎn)換傳遞給單片機(jī)處理,然后驅(qū)動語音模塊播報(bào)入場信息,單片機(jī)刷新OLED,完成車牌號顯示。當(dāng)?shù)谝淮巫R別到車牌號,判定為車輛入場,開始計(jì)時(shí),并語音播報(bào):“你好,歡迎停車”。第二次識別到車牌號,判定為出場,停止計(jì)時(shí),并將停車時(shí)長顯示在OLED 顯示模塊上,并將停車費(fèi)用顯示在OLED 屏上,同時(shí)語音播報(bào):“一路順風(fēng),歡迎下次光臨”。系統(tǒng)主程序流程圖如圖4所示。
圖4 系統(tǒng)主程序流程圖
圖像識別程序通過OpenMV 對車牌的圖像信息進(jìn)行拍攝以及識別,識別結(jié)果經(jīng)過模塊處理傳輸至單片機(jī)進(jìn)行判斷,執(zhí)行的過程如圖5所示。OLED 顯示程序設(shè)計(jì)主要是按照OLED的操作來進(jìn)行程序編寫,即按照寫指令、寫數(shù)據(jù),寫地址的方式對需要寫入的數(shù)據(jù)依次進(jìn)行寫入。設(shè)計(jì)語音播報(bào)模塊,根據(jù)單片機(jī)處理識別結(jié)果之后驅(qū)動模塊進(jìn)行對應(yīng)的入場、出場語音播報(bào)。
圖5 OpenMV數(shù)據(jù)采集子程序流程圖
編程軟件選擇Keil 4 軟件,采用C 語言進(jìn)行編程。首先編寫車牌識別系統(tǒng)設(shè)計(jì)代碼,然后在Keil 4 軟件進(jìn)行代碼編譯并調(diào)試,對出現(xiàn)的異常情況進(jìn)行排查,編譯成功將.hex文件下載至單片機(jī),對程序燒錄,最后進(jìn)行OpenMV、語音播報(bào)模塊、顯示傳感器子程序調(diào)試。觀察車輛的入場和出場是否能夠正確獲取數(shù)據(jù),驅(qū)動語音模塊進(jìn)行響應(yīng)播報(bào)。程序編譯效果如圖6所示。
圖6 編譯效果圖
主要源程序如下:
#include "sys.h"
#include "delay.h"
#include "FreeRTOS.h"
#include "task.h"
#include "stdio.h"
#include "sys_cfg.h"
#include "log/log.h"
#include "sys_boot.h"
//任務(wù)句柄
TaskHandle_t StartTask_Handler;
//任務(wù)函數(shù)
void start_task(void *pvParameters);
TaskHandle_t LED0Task_Handler;
//任務(wù)函數(shù)
void led0_task(void *pvParameters);
int main()
{
HAL_Init(); //初始化HAL庫
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYG ROUP_4);
Stm32_Clock_Init(RCC_PLL_MUL9);//設(shè)置時(shí)鐘,72M
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
__HAL_RCC_TIM3_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
__HAL_RCC_AFIO_CLK_ENABLE();
//使能I/O 復(fù)用時(shí)鐘 //使能ADC1 時(shí)鐘
delay_init(72); //初始化延時(shí)函數(shù)
log_init();
sys_boot(); /*系統(tǒng)啟動*/
return(1);
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //進(jìn)入臨界區(qū)
vTaskDelete(StartTask_Handler);
//刪除開始任務(wù)
taskEXIT_CRITICAL(); //退出臨界區(qū)
}
//LED0 任務(wù)函數(shù)
void led0_task(void *pvParameters)
{
float dis = 0;
while(1)
{
printf("1111");
vTaskDelay(1000);
}
}
系統(tǒng)首先利用OpenMV 通過對大量車牌圖像樣本進(jìn)行訓(xùn)練,生成模型,提高系統(tǒng)對車牌圖像的識別效率和正確率。模型訓(xùn)練好之后,將OpenMV 模塊對準(zhǔn)測試的車牌號就可以進(jìn)行識別。訓(xùn)練測試效果如圖7所示。
圖7 訓(xùn)練測試效果圖
利用OpenMV 對車牌圖片訓(xùn)練過程中,識別到某個(gè)字符時(shí),拉高相應(yīng)OpenMV 引腳的電平。STM32 單片機(jī)在檢測對應(yīng)引腳電平過程中,檢測某引腳為高電平,判定為識別到對應(yīng)的車牌,然后由主控芯片向OLED12864 顯示模塊發(fā)出指令,顯示車牌信息。
具體識別過中,首先對車輛進(jìn)行進(jìn)場識別,OpenMV正確識別車牌信息后,OLED12864 顯示模塊顯示歡迎停車與車牌信息,如圖8所示。
圖8 車輛進(jìn)場識別效果圖
車輛出場時(shí),OpenMV 再次對車輛信息進(jìn)行出場識別,正確識別車牌信息后,OLED 12864 顯示模塊顯示停車時(shí)長,并自動計(jì)算費(fèi)用,如圖9所示。
圖9 車輛出場識別效果圖
仿人機(jī)器人的步態(tài)行走設(shè)計(jì),利用STM32 單片機(jī)來控制開源舵機(jī)控制器,進(jìn)而操作舵機(jī),完成仿人機(jī)器人的行走、轉(zhuǎn)彎、翻滾動作,可實(shí)現(xiàn)在線調(diào)試與脫機(jī)運(yùn)行,動作相對穩(wěn)定、姿態(tài)標(biāo)準(zhǔn)。仿人機(jī)器人脫機(jī)調(diào)試時(shí),能夠做到斷開與上位機(jī)的連接后,脫機(jī)自動運(yùn)行編寫好的動作組文件,各模塊配合運(yùn)行平穩(wěn),舵機(jī)角度可無級調(diào)節(jié)、扭矩大,能勝任一些較復(fù)雜動作,動作運(yùn)行流暢,但是也存在一些問題,例如受限于電池包的重量體積等,故機(jī)器人續(xù)航時(shí)間較短,不能連續(xù)長時(shí)間運(yùn)行,這些都需要在后期的改進(jìn)中逐步優(yōu)化,本設(shè)計(jì)為國內(nèi)外相關(guān)仿人機(jī)器人的研究提供了一些借鑒。
基于圖像識別的車牌識別系統(tǒng)利用OpenMV 模塊和STM32F103C8T6 單片機(jī),完成圖像識別硬件電路設(shè)計(jì)和軟件流程設(shè)計(jì),通過大量車牌樣本數(shù)據(jù)的訓(xùn)練,得到訓(xùn)練模型,能夠?qū)崿F(xiàn)車輛進(jìn)場和出場的快速車牌識別,并通過設(shè)計(jì)語音播報(bào)模塊進(jìn)行語音播報(bào)提示,最后通過OLED12864 模塊顯示車輛停車時(shí)間,并可實(shí)現(xiàn)自動計(jì)費(fèi)功能,初步實(shí)現(xiàn)車牌識別系統(tǒng)智能控制效果,為智能停車場提供參考案例。