摘要:對于道路交通應用到的技術,車牌識別系統是交通管理的主要技術。所以車牌識別系統目前是一個交通管理必備的技術,因此本文對車牌識別系統進行了研究與實現。車流統計車牌驗證和移動車載系統車牌識別系統可以用于對車輛流量統計。
Hi,大家好,這里是丹成學長,今天向大家介紹一個 單片機項目
基于stm32的車牌識別系統設計
大家可用于 課程設計 或 畢業設計
技術解答、畢設幫助、開題指導print("Q 746876041")
在我們的日常生活中, 接觸到了很多關于電子科技的技術。 在電子科技交通領域中, 有很多技術都在無形中加入我們的生活, 如圖像處理技術, 自動檢測技術等。對于道路交通應用到的技術, 車牌識別系統是交通管理的主要技術。 一套完整的車牌識別系統, 可以給我們的日常生活帶來規范, 從而能夠使交通事故更少的發生,給我們的出行帶來順暢, 給我們的日常生活帶來方便。 所以車牌識別系統目前是一個交通管理必備的技術, 因此本文對車牌識別系統進行了研究與實現。
車牌識別系統的應用前景很廣泛, 用法也簡單可靠。 它不但用于道路交通監控,而且也用于小區和停車場方面的管理、 收費站管理系統、 車流統計、 車牌驗證和移動車載系統等方面。
小區和停車場車牌識別管理系統是對出入車輛的監控。 進出的車輛會被車牌系統識別, 并通過網絡傳輸, 識別出來的車牌信息發送到管理系統中登記, 這樣的流程不僅節省了人力保證了人員的安全, 也節約了進出登記時間, 大大提升了效率
在道路交通的檢測部門中, 每天都會出現大量的違規車輛。 對于那些列進“黑名冊” 中的車輛, 比如那些肇事過后逃逸的車輛、 那些已經掛失過的車輛和那些欠費過的汽車等, 我們通??梢詫⑦@些車的車牌用攝像機錄制成視頻記錄下來。 如果通過人工識別并比較車牌號碼, 這樣會導致工作的效率會比較低, 而且容易出現錯誤; 如果應用車牌識別系統, 給定一個車牌追蹤目標, 系統就會對攝像頭監控下的車輛信息進行自動掃描。 對于車牌號碼識別之后做比較并處理, 如果符合條件就立刻報警。
我國在 2019 年推出高速公路全面實行 ETC 交費, 車輛進出收費站, 不管是橋梁, 或是高速公路, 隧道等地方, 對于車牌識別系統的要求相對比較嚴格。 車牌識別系統可以大大減少平常收費系統工作量較大和人工容易產生疲勞等等的不足, 也可以減少勞動的強度, 節省了大量物力和人力。 同時, 對于 ETC 收費系統還能夠節省司機的大量開車時間。 因此在收費站, 車牌識別系統是一種高效率、 高質量的東西, 可以提高生活物質水平。
車牌識別系統可以用于對車輛流量統計。 當交通路道處于比較復雜的路段, 出現塞車或者車輛處于超速狀態時, 系統會根據捕獲到的車輛信息記錄發送到服務端,服務端再發送到對應車牌車主綁定的客戶端。 所以車牌識別的問題已經成為了交通工程領域中重點研究課題之一。
學長設計的系統由三個部分組成: 圖像采集、 處理和顯示裝置。 本文采用基于ARM cortex-m3 內核的 STM32F103 芯片作為設計平臺, 它具有較高的處理能力, 可以進行比較復雜的計算, 基本上可以滿足設計需要。 圖像采集用 OV7670 攝像頭。而顯示裝置是用 TFT_ILI9341 2.8 寸顯示屏。 系統模塊框圖如圖 所示。
車牌區域識別、 字符分割兩者均采用根據跳變點劃線的方式來對字符的邊界以及車牌區域進行確定。 攝像頭采集到圖像后進行掃描測試, 獲取攝像頭像素的值,再根據屏幕縱向 240 方向跳變點的顯示點數, 分析跳變點; 而車牌測定就根據屏幕橫向 320 方向跳變點的顯示進行分析。 兩個方向分析完畢后, 就會對字符進行分割,分割后就可以進行字符的識別。
STM32 核心板的 5V 引腳接著供電引腳, 系統的供電為 DC5V。 通過穩壓芯片,在 STM32 核心板上將 5V 的供電電壓轉換為 3.3V 電壓。 3.3V 電壓在 STM32 核心板的引腳輸出。 3.3V 作為供電電壓被 STM32 芯片、 OV7670 攝像頭和 TFT 液晶屏幕引用。
在系統適配度、 性能和性價比上經過對比后, 系統采用 OV7670攝像頭。 OV7670攝像頭功耗低, 可以與本系統的其他硬件搭配; 在性能上, 攝像頭自帶影像處理器和具備 VGA 攝像頭的操作功能。 并且具備的傳感器技術, 是攝像頭的亮點, 它可以完善甚至可以完全修復如托尾、 浮散等光學以及電子缺陷。
學長要想將采集到的車牌圖像信息以及識別結果得以顯示, 系統就必須有顯示部分。系統的使用 2. 8 寸的 TFT 顯示屏作為顯示模塊。 顯示屏默認 8 位的數據長度, 同時它支持 16 位長度的數據, 只要將一個 0 歐電阻連接在 R11 引腳, 就可以使用 16位。 顯示屏還支持 240*320 像素的 RGB565 格式。
車牌識別主要通過將采集到的數據進行拍照定位、字符分割及識別等技術得到,具體流程圖如圖。
首先對采集到的圖像進行大范圍搜索,找到符合的區域座位后選取,然后對其進行進一步判斷,最終選定最佳的區域分隔出來,具體流程如圖。
車牌區域出現了約 15 個以上的跳變點, 是通過二值化分析后呈現出來的。 根據跳變點的波動分析, 可以確定車牌區域的位置。
關鍵代碼
void ChangePoint_Show_240() ; //240 方向跳變點顯示{for(a=0; a<240; a++) { //顯示對應的橫向跳變點//跳變點顯示, 紅色標記LCD_DrawPoint(TableChangePoint_240[a], a, 0xf800) ;//跳變點個數(閾值) 設定if(TableChangePoint_240[a]>=15) {//顯示達到閾值標準的點for(b=35; b<40; b++) {LCD_DrawPoint(b, a, 0x6666) ; //Green}}16}}for(a=0; a<240; a++) { //建立參考線 10、 20、 30LCD_DrawPoint(a, Min_ChangePoint_240, 0x001f) ;LCD_DrawPoint(10, a, 0x63<<5) ; //10LCD_DrawPoint(20, a, 0x63<<5) ; //20LCD_DrawPoint(30, a, 0x63<<5) ; //30}void ChangePoint_Analysis_240() { //240 跳變點分析Min_ChangePoint_240=240;Max_ChangePoint_240=0;for(a=0; a<240; a++) //240 掃描, 獲取上下限值:Min_ChangePoint_240,Max_ChangePoint_240{while(TableChangePoint_240[a]<=15) //閾值調節{a++;}Min_ChangePoint_240=a;while(TableChangePoint_240[a]>15) //閾值調節{a++;}Max_ChangePoint_240=a;if(Max_ChangePoint_240-Min_ChangePoint_240>=15){a=240; //連續性}//向上微調 3 像素Min_ChangePoint_240=Min_ChangePoint_240-3;//向下微調 2 像素Max_ChangePoint_240=Max_ChangePoint_240+2;for(a=30; a<280; a++) //顯示上界限{LCD_DrawPoint(a, Max_ChangePoint_240, 0x001f) ;}for(a=30; a<280; a++) //顯示下界限{//顯示 50, 參考 50 像素位置處, 車牌位置不要超過這根線, 免得不能字符的歸一化處理for(a=30; a<280; a++){LCD_DrawPoint(a, Min_ChangePoint_240+50, 0xf800) ;}flag_MaxMinCompare=1;//判斷合法性 1: 最小值>最大值if(Min_ChangePoint_240>Max_ChangePoint_240){flag_MaxMinCompare=0;}//判斷合法性 2:if(Min_ChangePoint_240==240| | Max_ChangePoint_240==0){flag_MaxMinCompare=0;}//判斷合法性 3:if(Max_ChangePoint_240-Min_ChangePoint_240<15){flag_MaxMinCompare=0;}}
對檢測得到的車牌進行切割,從而達到將每一位字符分隔開并為下一步做鋪墊。具體流程如圖。
車牌的整體長度為 44cm, 寬度為 14cm。 不計第 2、 3 個字符中間的小圓點, 車牌上共有 7 個字符, 均為規則的印刷體字。 除了軍車、 警車、 教練車、 領事館車外,標準的民用車輛牌照均為 7 個字符。
車牌首位為省名簡稱, 是一個漢字, 如粵、 蘇、 遼等。 次位為英文字母, 接下來為英文字母或阿拉伯數字。 其中每個字符統一寬度為 4. 5cm, 高 9cm, 第二、 三個字符間間距為 3.4cm, 中間小圓點 1cm 寬, 小圓點與第 2、 3 個字符間間距分別為1.2cm, 其余字符間間距為 1.2cm。
如果分析后根據邊沿, 里面的字符數為整個車牌, 也就是 8 個完整的字符, 則會更加精確切割出每個字符位置。 在處理過程中, 獲取每個字符的左邊界 KL 和右邊界 K R 。 如下圖所示, 垂直藍線是每個文字的邊界標記。 字符分割, 為下一個字符匹配準備通用參數。
字符分割后, 進行歸一化處理, 逐個字符進行匹配。 程序中的字符模板由模板提取軟件提取, 模板大小為 24*50 的單一像素。 逐個字符進行匹配, 以相似度值最大的對應字符作為輸出結果并顯示。
關鍵代碼
Stm32_Clock_Init(16) ; //初始化時鐘Data_LCD_ColorChange() ; //車牌測定u8 MoShiShiBie_All(u8 begin, u8 end) //字符匹配, 模式識別, 選擇性匹配{u16 Compare_num, num_save;u8 a, b, e, a_save, st1, st2, s1, s2;int num1;for(a=begin; a<end; a++)//36{num1=0;for(b=0; b<150; b++){st1=table_picture[b];st2=Table[150*a+b];for(e=0; e<8; e++){s1=st1&(1<<e) ;s2=st2&(1<<e) ;if(s1==s2) num1++;}}}}
顯示屏會顯示實時的步驟。 通電后, 屏幕首先會初始化, 會出現綠色和紅色兩個界面; 第二會根據傳輸到屏幕上圖像, 顯示屏有 20 秒的處理時間進行二值化分析出車牌區域; 第三, 顯示屏圖像靜止, 對車牌進行切割處理; 第四把每個切割后的字符與取模的標準車牌模型進行比較, 把相似度最高的字符輸出; 最后把車牌結果輸出到結果界面。
外場測試
#include "system.h"#include "SysTick.h"#include "led.h"#include "usart.h"#include "tftlcd.h"#include "key.h"#include "malloc.h" #include "sd.h"#include "flash.h"#include "ff.h" #include "fatfs_app.h"#include "exti.h"#include "time.h" #include "ov7670.h"#include "bmp.h"#include "esp8266_drive.h"extern u8 ov_sta; //在exit.c里面定義extern u8 ov_frame; //在time.c里面定義//更新LCD顯示void camera_refresh(void){ u32 i,j; u16 color; if(ov_sta)//有幀中斷更新 { LCD_Display_Dir(1); LCD_Set_Window(0,(tftlcd_data.height-240)/2,320-1,240-1);//將顯示區域設置到屏幕中央 OV7670_RRST=0; //開始復位讀指針 OV7670_RCK_L; //設置讀數據時鐘為低電平 OV7670_RCK_H; OV7670_RCK_L; OV7670_RRST=1; //復位讀指針結束 OV7670_RCK_H; for(j=76800;j>0;j--)//較快方式 { OV7670_RCK_L; color=GPIOF->IDR&0XFF; //讀數據 OV7670_RCK_H; color<<=8; OV7670_RCK_L; color|=GPIOF->IDR&0XFF; //讀數據 OV7670_RCK_H; LCD_WriteData_Color(color); //顯示圖片 } } ov_sta=0; //清零幀中斷標記 ov_frame++; LCD_Display_Dir(0);}int main(){ u8 i=0; u8 sbuf[15]; u8 count; u8 res; u8 sd_ok; u8 *pname; //帶路徑的文件名 u8 key; u8 *lp; //存儲車牌 SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優先級分組 分2組 LED_Init(); USART1_Init(9600); ESP8266_Init(115200); ESP8266_STA_LinkAP(); TFTLCD_Init(); //LCD初始化 KEY_Init(); EN25QXX_Init(); //初始化EN25Q128 my_mem_init(SRAMIN); //初始化內部內存池 while(OV7670_Init())//初始化OV7670 { LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,24,"OV7670 ERROR!"); delay_ms(200); LCD_Fill(10,10,239,206,WHITE); delay_ms(200); } LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,24,"OV7670 OK!"); delay_ms(1500); while(FATFS_Init()){ LCD_ShowString(10,40,tftlcd_data.width,tftlcd_data.height,24,"FATFS ERROR!"); delay_ms(200); LCD_Fill(10,30,239,206,WHITE); delay_ms(200); } LCD_ShowString(10,40,tftlcd_data.width,tftlcd_data.height,24,"FATFS OK!"); delay_ms(1500); //掛載SD卡 //創建PHOTO文件夾 do{ f_mount(fs[0],"0:",1); res=f_mkdir("0:/PHOTO"); if(res!=FR_EXIST&&res!=FR_OK) //發生了錯誤 { LCD_ShowString(10,70,tftlcd_data.width,tftlcd_data.height,24,"SD ERROR!"); delay_ms(200); LCD_ShowString(10,100,tftlcd_data.width,tftlcd_data.height,24,"PHOTO ERROR!"); sd_ok=0; }else { LCD_ShowString(10,70,tftlcd_data.width,tftlcd_data.height,24,"PHOTO OK!"); delay_ms(200); LCD_ShowString(10,100,tftlcd_data.width,tftlcd_data.height,24,"KEY_UP TAKE PHOTO!"); LCD_ShowString(10,130,tftlcd_data.width,tftlcd_data.height,24,"KEY_DOWN LPR!"); sd_ok=1; } }while(sd_ok!=1); pname=mymalloc(SRAMIN,30); //為帶路徑的文件名分配30個字節的內存 while(pname==NULL) //內存分配出錯 { LCD_ShowString(10,130,tftlcd_data.width,tftlcd_data.height,24,"MEMORY ERROR!"); delay_ms(200); LCD_Fill(10,30,239,206,WHITE); delay_ms(200); } OV7670_Light_Mode(0); OV7670_Color_Saturation(2); OV7670_Brightness(2); OV7670_Contrast(2); OV7670_Special_Effects(0); TIM4_Init(10000,7199); //10Khz計數頻率,1秒鐘中斷 EXTI7_Init(); OV7670_Window_Set(12,176,240,320); //設置窗口 OV7670_CS=0; LCD_Clear(WHITE); while(1) { camera_refresh(); key=KEY_Scan(0); if(key==KEY_UP) { if(sd_ok) { camera_new_pathname(pname);//得到文件名 if(bmp_encode(pname,0,0,240,320,0)) { LCD_ShowString(10,330,tftlcd_data.width,tftlcd_data.height,24,"TAKE PHOTO ERROR!"); }else { LCD_ShowString(10,330,tftlcd_data.width,tftlcd_data.height,24,"TAKE PHOTO OK!"); } } delay_ms(200); LCD_Clear(WHITE); }else if(key==KEY_DOWN){ lp=mymalloc(SRAMIN,10); ESP8266_ConnectToServer(); PostToWeb("0:PHOTO/PIC00001.bmp",lp); printf("%s",lp); LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,24,"OK!"); LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,24,lp); } else if(key==KEY_RIGHT)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125590.html
摘要:目前病房呼叫系統主要有兩種一種是有線式一種是無線式。而在我國,大多數醫院都是采用的傳統的有線式病房呼叫系統。主程序設計病房呼叫系統程序設計使用的是本身的固件庫。 ...
摘要:中控部分采用了單片機,其主要作用是獲取輸入部分數據,經過內部處理,控制輸出部分。 設計簡介: 本設計是基于單片機的智能家居控制系統,主要實現以下功能: 可通過DS18B20實時測量環境溫度溫度具有上下限,自動模式下溫度超出限值,GMS發送短信溫度上下限通過手機藍牙設置系統可通過手機藍牙、紅外...
閱讀 3735·2023-01-11 11:02
閱讀 4244·2023-01-11 11:02
閱讀 3050·2023-01-11 11:02
閱讀 5180·2023-01-11 11:02
閱讀 4737·2023-01-11 11:02
閱讀 5534·2023-01-11 11:02
閱讀 5313·2023-01-11 11:02
閱讀 3986·2023-01-11 11:02