【图像识别】基于模板匹配算法实现卡牌识别matlab代码

462 阅读3分钟

1 简介

车辆车牌识别系统的基本工作原理为:将摄像头拍摄到的包含车辆车牌的图像输入到计算机中进行预处理,再由检索模块对车牌进行搜索、检测、定位,并分割出包含车牌字符的矩形区域,然后对车牌字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。车牌自动识别是一项利用车辆的动态视频或静态图像进行车牌号码、车牌颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。一个完整的车牌识别系统应包括车辆检测、图像采集、车牌识别等几部分。车牌识别单元对图像进行处理,定位出车牌位置,再将车牌中的字符分割出来进行识别,然后组成车牌号码输出,再获得当前时间。通过出停车场时对车辆再次进行处理,获得停车时间。

​2 部分代码

%-----------------------------出停车场---------------------------
clc;
clear all;
[filename,filepath]=uigetfile('.jpg','输入一个需要识别的车牌图像');% 直接自动读入%
fil=strcat(filepath,filename); %strcat函数:连接字符串;把filepath的字符串与filename的连接,即路径/文件名
I=imread(fil);
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);  
[y,x,z]=size(I5);  
myI=double(I5);  
t
% 滤波  
h=fspecial('average',3);  
d=im2bw(round(filter2(h,d)));  


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);  
[m,n]=size(word1);  
%归一化大小为40*20
word1=imresize(word1,[40 20]);
word2=imresize(word2,[40 20]);
word3=imresize(word3,[40 20]);
word4=imresize(word4,[40 20]);
word5=imresize(word5,[40 20]);
word6=imresize(word6,[40 20]);
word7=imresize(word7,[40 20]);
imwrite(word1,'1.jpg');
imwrite(word2,'2.jpg');
imwrite(word3,'3.jpg');
imwrite(word4,'4.jpg');
imwrite(word5,'5.jpg');
imwrite(word6,'6.jpg');
imwrite(word7,'7.jpg');

 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;
%与文本文件数据对比
file=fopen('Data.txt');
while feof(file)~=1
   fid=fgetl(file);
  if(strcmp(fid,Code)==1)
      fic=fgetl(file);
  end
end
fclose(file);
fib=datestr(now);
fie=datevec(fic);
fid=datevec(fib);
ts=etime(fid,fie);
aa={Code;num2str(ts);'单位为秒'};
msgbox(aa,'车牌及停车时间');%弹出框

3 仿真结果

4 参考文献

[1]赖特. "基于模板匹配及人工神经网络算法的图像识别应用——MATLAB实现机动车牌号码辨识." 智能建筑与智慧城市 11(2017):5.

部分理论引用网络文献,若有侵权联系博主删除。

5 MATLAB代码与数据下载地址

见博客主页