基于MATLAB实现(GUI)汽车出入库识别系统

车牌识别

**一、**课题介绍

随着汽车数量的增加,城市交通状况日益受到人们的重视,如何进行有效的交通管理更是成为了人们关注的焦点。智能交通系统通过车辆检测装置对过往的车辆实施检测,提取有关交通数据,达到监控、管理和指挥交通的目的。因此,它已成为世界交通领域研究的重要课题。 车牌识别系统作为智能交通系统的一个重要组成部分,已在高速公路、城市交通和停车场等项目的管理中占有无可取代的重要地位。它在不影响汽车状态的情况下,由计算机自动完成车牌的识别,从而降低交通管理工作的复杂度。

该课题为基于 MATLAB 的汽车出入库识别系统,带有丰富的人机交互 GUI 界面。目前毕业设计选题中,传统车牌识别不易得到高分,必须要在此基础上有所创新方得可以避开其他雷同课题,,不会轻易被导师被否决。因此建议在车牌识别基础上加入出入库,判别是否为库内车牌,并且实行计时收费。整个设计在一个 GUI 界面上完成。

传统基础版:中规中矩的车牌识别

靓点 1 版本:可做成复杂背景的车牌识别

靓点 2 版本:可做成具备判断是否为库内车牌的案例,并且计时计费(本课题)

靓点 3 版本:可做成具备语音播报的车牌识别

**二、**基本流程

车牌识别部分:

① 图像预处理:在整个车牌识别系统中,由于采集进来的图像为真彩图,再加上实际采集环境的影响以及采集硬件等原因,图像质量并不高,其背景和噪声会影响字符的正确分割。和识别,所以在进行车牌分割和识别处理之前,需要先对车牌图像进行图像预处理操作。

② 车牌定位:首先对车牌的二值图片进行形态学滤波,使车牌区域形成一个连通区域,然后根据车牌的先验知识对所得到的连通区域进行筛选,获取车牌区域的具体位置,完成从图片中提取车牌的任务。

③ 车牌分割:首先对车牌进行水平投影,去除水平边框;再对车牌进行垂直投影。通过对车牌进行投影分析可知,与最大值峰中心对应的为车牌中第二个字符和第三个字符的间隔,与第二大峰中心距离对应的即为车牌字符的宽度,并以此为依据对车牌进行分割。

④ 字符识别:本文采用模板匹配方法来对车牌进行识别。识别过程中,首先建立标准字库,再将分割所得到的字符进行归一化,将归一化处理后的字符与标准字库里的字符逐一比较,最后把误差最小的字符作为结果显示出来。

出入库部分:

① 汽车入库记录北京时间,车库位数减一;

② 汽车出库记录北京时间,车库位数加一;

③ 计算停车时长,按标准计算停车费用;

**三、**GUI 设计图

复制代码
GUI界面设计图

GUI 制作说明:GUI 是 MATLAB 的人机交互式 GUI 界面,有 GUI 界面,所有操作可在一个界面上完成,可以为毕设增分不少。GUI 可在 MATLAB 命令行窗口输入 guide 回车快速打开,GUI 常用的控件有 axes,edit,putton,text 几个组件,不同组件之间通过回调函数来进行连接,触发操作,可教学 GUI 制作,以及友情推荐同类岗位工作。

**四、**代码附录

1、车牌载入

复制代码
[filename,filepath]=uigetfile('.jpg','输入车牌图像');% 直接自动读入%
file=strcat(filepath,filename); %strcat函数:连接字符串;把filepath的字符串与filename的连接,即路径/文件名
I=imread(file);
axes(handles.axes1)%让车牌显示在axes1控件中
imshow(I)%显示
title('车牌')

2、图像预处理

复制代码
I1=rgb2gray(I);  %灰度处理
I2=edge(I1,'roberts',0.15,'both');  %边缘检测
se=[1;1;1];  
I3=imerode(I2,se);  
se=strel('rectangle',[25,25]);  
I4=imclose(I3,se);  %闭运算,去除杂质影响
I5=bwareaopen(I4,2000);  %膨胀操作

3、车牌定位

复制代码
[y,x,z]=size(I5);  
myI=double(I5);  
tic
 white_y=zeros(y,1);  
 for i=1:y  
    for j=1:x  
             if(myI(i,j,1)==1)   
                white_y(i,1)= white_y(i,1)+1;   
            end    
     end         
 end  
 [temp MaxY]=max(white_y);  
 PY1=MaxY;  
 while ((white_y(PY1,1)>=5)&&(PY1>1))  
        PY1=PY1-1;  
 end      
 PY2=MaxY;  
 while ((white_y(PY2,1)>=5)&&(PY2<y))  
        PY2=PY2+1;  
 end  
 IY=I(PY1:PY2,:,:);  
 white_x=zeros(1,x);  
 for j=1:x  
     for i=PY1:PY2  
            if(myI(i,j,1)==1)  
                white_x(1,j)= white_x(1,j)+1;                 
            end    
     end         
 end  
    
 PX1=1;  
 while ((white_x(1,PX1)<3)&&(PX1<x))  
       PX1=PX1+1;  
 end      
 PX2=x;  
 while ((white_x(1,PX2)<3)&&(PX2>PX1))  
        PX2=PX2-1;  
 end  
 PX1=PX1-2;  
 PX2=PX2+3;  
 dw=I(PY1:PY2-8,PX1:PX2,:);  
 axes(handles.axes2)
 imshow(dw)
 title('定位的车牌')

4、字符分割

复制代码
% 切割出 7 个字符  
y1=10;y2=0.25;flag=0;word1=[];  
while flag==0  
    [m,n]=size(d);  
    left=1;wide=0;  
    while sum(d(:,wide+1))~=0  
        wide=wide+1;  
    end  
    if wide<y1   % 认为是左侧干扰  
        d(:,[1:wide])=0;  
        d=qiege(d);  
    else  
        temp=qiege(imcrop(d,[1 1 wide m]));  
        [m,n]=size(temp);  
        all=sum(sum(temp));  
        two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));  
        if two_thirds/all>y2  
            flag=1;word1=temp;   % WORD 1  
        end  
        d(:,[1:wide])=0;d=qiege(d);  
    end  
end  
% 分割出第二个字符  
[word2,d]=getword(d);  
% 分割出第三个字符  
[word3,d]=getword(d);  
% 分割出第四个字符  
[word4,d]=getword(d);  
% 分割出第五个字符  
[word5,d]=getword(d);  
% 分割出第六个字符  
[word6,d]=getword(d);  
% 分割出第七个字符  
[word7,d]=getword(d);

5、字符识别

复制代码
liccode=char(['0':'9' 'A':'Z' '京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼']);%SubBw2=zeros(40,20);
l=1;
for I=1:7;
    ii=int2str(I);
    t=imread([ii,'.jpg']);
    SegBw2=imresize(t,[40 20],'nearest');
    SegBw2=double(SegBw2)>20;
    if l==1 %第一位汉字识别
        kmin=37;
        kmax=43;
    elseif l==2 %第二位字母识别
        kmin=11;
        kmax=36;
    else l>=3   %第三位后字母或数字识别
        kmin=1;
        kmax=36;
        
    end
    for k2=kmin:kmax
        fname=strcat('字符模板\',liccode(k2),'.jpg');
        SamBw2=imread(fname);
        SamBw2=double(SamBw2)>1;
        for i=1:40
            for j=1:20
                SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
            end
        end
        %相当于两幅图相减得第三幅图
        Dmax=0;
        for k1=1:40;
            for l1=1:20
                if(SubBw2(k1,l1)>0 || SubBw2(k1,l1)<0)
                    Dmax=Dmax+1;
                end
            end
        end
        Error(k2)=Dmax;
    end
    Error1=Error(kmin:kmax);
    MinError=min(Error1);
    findc=find(Error1==MinError);
    Code(l*2-1)=liccode(findc+kmin-1);
    Code(l*2)=' ';
    l=l+1;
end
t=toc;
set(handles.text4,'string',Code)

**五、**预期效果图

复制代码
部分运行效果图

♻️ 资源

大小: 1.22MB

➡️ 资源下载: https://download.csdn.net/download/s1t16/87415783

注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!

相关推荐
小鸡吃米…2 小时前
基准测试与性能分析
开发语言·python
今儿敲了吗2 小时前
python基础学习笔记第一章
开发语言·python
badhope2 小时前
C语言二级考点全解析与真题精讲
c语言·开发语言·c++·人工智能·python·microsoft·职场和发展
醉酒柴柴2 小时前
word创建样式以后应用于所有新文件
开发语言·学习·c#·word
2401_900151543 小时前
C++中的桥接模式
开发语言·c++·算法
Yvonne爱编码3 小时前
二叉树高频题精讲 | 从入门到熟练掌握二叉树操作2
开发语言·python
JosieBook3 小时前
【WinForm】C# WinForms 跨线程更新 UI 避坑指南
开发语言·ui·c#
知无不研3 小时前
c++垃圾回收机制
开发语言·c++·智能指针·raii·垃圾回收机制
J2虾虾3 小时前
Springboot项目中循环依赖的问题
java·开发语言