毕业设计-题目:基于stm32的车牌识别系统设计(代码片段)

DC-STDIO DC-STDIO     2023-02-15     569

关键词:


1 简介

Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目

基于stm32的车牌识别系统设计

大家可用于 课程设计 或 毕业设计

技术解答、毕设帮助、开题指导
print("Q 746876041") 

2 项目课题背景

在我们的日常生活中, 接触到了很多关于电子科技的技术。 在电子科技交通领域中, 有很多技术都在无形中加入我们的生活, 如图像处理技术, 自动检测技术等。对于道路交通应用到的技术, 车牌识别系统是交通管理的主要技术。 一套完整的车牌识别系统, 可以给我们的日常生活带来规范, 从而能够使交通事故更少的发生,给我们的出行带来顺畅, 给我们的日常生活带来方便。 所以车牌识别系统目前是一个交通管理必备的技术, 因此本文对车牌识别系统进行了研究与实现。

3 应用场景

车牌识别系统的应用前景很广泛, 用法也简单可靠。 它不但用于道路交通监控,而且也用于小区和停车场方面的管理、 收费站管理系统、 车流统计、 车牌验证和移动车载系统等方面。

3.1 小区和停车场方面的管理

小区和停车场车牌识别管理系统是对出入车辆的监控。 进出的车辆会被车牌系统识别, 并通过网络传输, 识别出来的车牌信息发送到管理系统中登记, 这样的流程不仅节省了人力保证了人员的安全, 也节约了进出登记时间, 大大提升了效率

3.2 交通道路的监控

在道路交通的检测部门中, 每天都会出现大量的违规车辆。 对于那些列进“黑名册” 中的车辆, 比如那些肇事过后逃逸的车辆、 那些已经挂失过的车辆和那些欠费过的汽车等, 我们通常可以将这些车的车牌用摄像机录制成视频记录下来。 如果通过人工识别并比较车牌号码, 这样会导致工作的效率会比较低, 而且容易出现错误; 如果应用车牌识别系统, 给定一个车牌追踪目标, 系统就会对摄像头监控下的车辆信息进行自动扫描。 对于车牌号码识别之后做比较并处理, 如果符合条件就立刻报警。

3.3 收费站管理系统

我国在 2019 年推出高速公路全面实行 ETC 交费, 车辆进出收费站, 不管是桥梁, 或是高速公路, 隧道等地方, 对于车牌识别系统的要求相对比较严格。 车牌识别系统可以大大减少平常收费系统工作量较大和人工容易产生疲劳等等的不足, 也可以减少劳动的强度, 节省了大量物力和人力。 同时, 对于 ETC 收费系统还能够节省司机的大量开车时间。 因此在收费站, 车牌识别系统是一种高效率、 高质量的东西, 可以提高生活物质水平。

3.4 车流统计、 车牌验证和移动车载系统

车牌识别系统可以用于对车辆流量统计。 当交通路道处于比较复杂的路段, 出现塞车或者车辆处于超速状态时, 系统会根据捕获到的车辆信息记录发送到服务端,服务端再发送到对应车牌车主绑定的客户端。 所以车牌识别的问题已经成为了交通工程领域中重点研究课题之一。

4 系统设计方案

4.1 硬件方案

学长设计的系统由三个部分组成: 图像采集、 处理和显示装置。 本文采用基于ARM cortex-m3 内核的 STM32F103 芯片作为设计平台, 它具有较高的处理能力, 可以进行比较复杂的计算, 基本上可以满足设计需要。 图像采集用 OV7670 摄像头。而显示装置是用 TFT_ILI9341 2.8 寸显示屏。 系统模块框图如图 所示。

4.2 软件实现流程

车牌区域识别、 字符分割两者均采用根据跳变点划线的方式来对字符的边界以及车牌区域进行确定。 摄像头采集到图像后进行扫描测试, 获取摄像头像素的值,再根据屏幕纵向 240 方向跳变点的显示点数, 分析跳变点; 而车牌测定就根据屏幕横向 320 方向跳变点的显示进行分析。 两个方向分析完毕后, 就会对字符进行分割,分割后就可以进行字符的识别。

5 硬件系统设计

5.1 主控STM32

STM32 核心板的 5V 引脚接着供电引脚, 系统的供电为 DC5V。 通过稳压芯片,在 STM32 核心板上将 5V 的供电电压转换为 3.3V 电压。 3.3V 电压在 STM32 核心板的引脚输出。 3.3V 作为供电电压被 STM32 芯片、 OV7670 摄像头和 TFT 液晶屏幕引用。

5.2 摄像头

在系统适配度、 性能和性价比上经过对比后, 系统采用 OV7670摄像头。 OV7670摄像头功耗低, 可以与本系统的其他硬件搭配; 在性能上, 摄像头自带影像处理器和具备 VGA 摄像头的操作功能。 并且具备的传感器技术, 是摄像头的亮点, 它可以完善甚至可以完全修复如托尾、 浮散等光学以及电子缺陷。

5.3 显示屏

学长要想将采集到的车牌图像信息以及识别结果得以显示, 系统就必须有显示部分。系统的使用 2. 8 寸的 TFT 显示屏作为显示模块。 显示屏默认 8 位的数据长度, 同时它支持 16 位长度的数据, 只要将一个 0 欧电阻连接在 R11 引脚, 就可以使用 16位。 显示屏还支持 240*320 像素的 RGB565 格式。

6 软件设计

车牌识别主要通过将采集到的数据进行拍照定位、字符分割及识别等技术得到,具体流程图如图。

6.1 车牌定位

首先对采集到的图像进行大范围搜索,找到符合的区域座位后选取,然后对其进行进一步判断,最终选定最佳的区域分隔出来,具体流程如图。

车牌区域出现了约 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、 30
LCD_DrawPoint(a, Min_ChangePoint_240, 0x001f) ;
LCD_DrawPoint(10, a, 0x63<<5) ; //10
LCD_DrawPoint(20, a, 0x63<<5) ; //20
LCD_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;




6.2 字符分割

对检测得到的车牌进行切割,从而达到将每一位字符分隔开并为下一步做铺垫。具体流程如图。

车牌的整体长度为 44cm, 宽度为 14cm。 不计第 2、 3 个字符中间的小圆点, 车牌上共有 7 个字符, 均为规则的印刷体字。 除了军车、 警车、 教练车、 领事馆车外,标准的民用车辆牌照均为 7 个字符。

车牌首位为省名简称, 是一个汉字, 如粤、 苏、 辽等。 次位为英文字母, 接下来为英文字母或阿拉伯数字。 其中每个字符统一宽度为 4. 5cm, 高 9cm, 第二、 三个字符间间距为 3.4cm, 中间小圆点 1cm 宽, 小圆点与第 2、 3 个字符间间距分别为1.2cm, 其余字符间间距为 1.2cm。

如果分析后根据边沿, 里面的字符数为整个车牌, 也就是 8 个完整的字符, 则会更加精确切割出每个字符位置。 在处理过程中, 获取每个字符的左边界 KL 和右边界 K R 。 如下图所示, 垂直蓝线是每个文字的边界标记。 字符分割, 为下一个字符匹配准备通用参数。

6.3 字符识别

字符分割后, 进行归一化处理, 逐个字符进行匹配。 程序中的字符模板由模板提取软件提取, 模板大小为 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++;





7 实物测试

显示屏会显示实时的步骤。 通电后, 屏幕首先会初始化, 会出现绿色和红色两个界面; 第二会根据传输到屏幕上图像, 显示屏有 20 秒的处理时间进行二值化分析出车牌区域; 第三, 显示屏图像静止, 对车牌进行切割处理; 第四把每个切割后的字符与取模的标准车牌模型进行比较, 把相似度最高的字符输出; 最后把车牌结果输出到结果界面。


外场测试

8 部分关键代码

#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)
				毕业设计:题目:基于stm32的语音识别-单片机嵌入式物联网语音识别(代码片段)

...机项目于stm32的智能婴儿车婴儿床大家可用于课程设计或毕业设计技术解答、毕设帮助、开题指导print("Q746876041")1项目目标项目最终实现功能:用户说出指定的语音,硬件系统(由STM32和LD3320构成)能识别并... 查看详情

13基于stm32的语音识别垃圾桶

13、基于STM32的语音识别垃圾桶引言1系统概述1.1设计任务1.2设计要求2方案设计及论证2.1确定控制方案2.2芯片选型2.2.1主控芯片选型2.2单片机STC11L08XE2.3语音识别模块介绍3硬件设计3.1最小系统模块3.2稳压电路3.3语音识别接口4系统程... 查看详情

基于matlab的汽车出入库计时系统_matlab课程设计(代码片段)

题目:基于MATLAB的汽车出入库计时系统所修课程名称:计算机仿真技术目录一、设计要求二、题目分析三、总体方案论证四、系统总体设计五、各部分定性说明以及定量计算5.1图像采集5.2图像的预处理5.3车牌定位5.3.1基于... 查看详情

基于pythonopencv的车牌识别智能计费系统设计

...性高的车牌识别系统。本文即是针对这一问题开发了一款基于pythonOpenCV车牌识别计费系统,本系统对车牌的图像处理主要来源于计算机视觉库OpenCV,采用了Python语言来对车牌进行识别。该识别系统通过对车牌的文本图像信息进行车... 查看详情

camera基于深度学习的车牌检测与识别系统实现(课程设计)

基于深度学习的车牌检测与识别系统实现(课程设计)代码+数据集下载地址:下载地址用python3+opencv3做的中国车牌识别,包括算法和客户端界面,只有2个文件,surface.py是界面代码,predict.py是算法代码,界面不是重点所以用tkint... 查看详情

基于pythonopencv的车牌识别智能计费系统设计

...性高的车牌识别系统。本文即是针对这一问题开发了一款基于pythonOpenCV车牌识别计费系统,本系统对车牌的图像处理主要来源于计算 查看详情

基于matlab的汽车出入库计时系统_matlab课程设计(代码片段)

题目:基于MATLAB的汽车出入库计时系统所修课程名称:计算机仿真技术目录一、设计要求二、题目分析三、总体方案论证四、系统总体设计五、各部分定性说明以及定量计算5.1图像采集5.2图像的预处理5.3车牌定位5.3.1基于... 查看详情

毕业设计-题目:基于stm32的智能温控风扇设计与实现(代码片段)

文章目录1简介2绪论2.1课题背景3系统设计3.1系统架构3.2硬件部分3.2.1DS18B20简介3.2.2LCD1602液晶屏简介3.3软件部分3.3.1整体软件流程3.3.2初始化3.3.3温度采集与显示3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成... 查看详情

毕设题目:matlab车牌识别

1车牌识别系统设计与实现车牌识别系统主要分为三部分:车牌图像预处理、特征提取以及基于BP神经网络对特征进行训练和分类,流程图如图1所示。图1车牌识别系统组成示意图2车牌图像预处理车牌图像预处理是对车牌... 查看详情

基于tensorflow的车牌号识别系统

...景门牌号的单个端到端神经网络系统。然后,作者阐述了基于同样的网络结构如何来突破谷歌验证码识别系统的准确率。 为了亲身体验神经网络的实现,我决定尝试设计一个可以解决类似问题的系统:车牌号自动识别系统。... 查看详情

基于stm32单片机项目设计目录-加油吧√

★♥基于STM32单片机项目设计目录√♥※目录★♥基于STM32单片机项目设计目录√♥※1、基于STM32的音乐喷泉2、STM32的智能浇水补光系统3、基于STM32的手机通过wifi控LED灯4、基于STM32的电子打铃器5、基于STM32的智能手环6、基于STM32... 查看详情

基于stm32单片机项目设计目录-加油吧√

★♥基于STM32单片机项目设计目录√♥※目录★♥基于STM32单片机项目设计目录√♥※1、基于STM32的音乐喷泉2、STM32的智能浇水补光系统3、基于STM32的手机通过wifi控LED灯4、基于STM32的电子打铃器5、基于STM32的智能手环6、基于STM32... 查看详情

基于stm32单片机智能rfid刷卡汽车位锁设计(开题报告)

...及体系结构设计四、主要参考文献与资料获得情况:五、毕业设计(论文)进度安排(按周说明)六、元器件一、课题的背景及意义射频识别,RFID(RadioFrequencyIdentification)技术,又称无线射频识别 查看详情

毕业设计——基于stm32的智能家具系统(语音识别控制步进电机舵机)(代码片段)

智能家具系统分为两个不同版本系列:①系列一:手机app远程控制、远程检测温湿度显示在app,(云平台)!!!!          https://blog.csdn.net/m0_59113542/article/details/123737710②系列二:语音识别控... 查看详情

毕业设计-题目:基于stm32的自动泊车系统-智能小车自动停车(代码片段)

...片机项目基于STM32的自动泊车系统大家可用于课程设计或毕业设计技术解答、毕设帮助、开题指导print("Q746876041")1背景目前我们所能见到的汽车企业大多数都控制在L2级半自动驾驶,其中包括半自动泊车系统:传感器... 查看详情

19基于stm32的电子打铃器

19、基于STM32的电子打铃器引言1系统概述1.1设计任务1.2设计要求2方案设计与论证2.1芯片选择方案2.2系统概述:2.3设计要求:2.4系统总体设计思路2.5各功能模块程序实现原理分析3STM32性能介绍及硬件设计3.1STM32单片机性能介绍3.2电... 查看详情

19基于stm32的电子打铃器

19、基于STM32的电子打铃器引言1系统概述1.1设计任务1.2设计要求2方案设计与论证2.1芯片选择方案2.2系统概述:2.3设计要求:2.4系统总体设计思路2.5各功能模块程序实现原理分析3STM32性能介绍及硬件设计3.1STM32单片机性能介绍3.2电... 查看详情

项目设计基于stm32人脸识别系统-单片机物联网嵌入式(代码片段)

一.前言项目设计主要是对于所学知识的整体回顾,需要结合各个学科,才能做出达到符合标准的设计。文章的目的在分享优质的项目以及项目经验,提供设计思路,欢迎交流与指正不足之处。二.简介由... 查看详情