MATLAB车牌识别过程.docx
- 文档编号:30424650
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:15
- 大小:709.85KB
MATLAB车牌识别过程.docx
《MATLAB车牌识别过程.docx》由会员分享,可在线阅读,更多相关《MATLAB车牌识别过程.docx(15页珍藏版)》请在冰豆网上搜索。
MATLAB车牌识别过程
7.3系统详细设计
7.3.1车牌图像读入
目前常用的图像格式主要有*.PCX、*.BMP、*.JPG、*.TIFF、*.GIF等,本设计采集到的图片格式为*.JPG格式,这种格式的图像占有的存储空间小,而且是使用最广的图片保存和传输格式,大多数的摄像设备也都是以*.JPG格式保存图像的。
利用图像工具的图像读取函数imread()来读取一副图像,其使用格式为:
I=imread(‘fnpn’);%fn为图像文件名,pn为文件路径
使用图像工具的图像显示函数imshow()来显一副图像,使用格式为:
Imshow(I);
具体代码为:
[fnpn]=uigetfile(‘*.JPG’,’选择图片’);%选择图像文件,fn为文件名,pn为路径
I=imread([fnpn]);%显示所选图像
Figure,imshow(I);title(‘原始车牌图像’);%在新建的figure中显示所选图像文件,figure标题为原始车牌图像
以一副名为“桂APC322”的车牌图片为例,程序运行结果为:
7.3.2彩色(基于蓝色)车牌定位、提取
将彩色车牌读入后,采用水平垂直双向投影法,将图像分别投影到X、Y坐标轴,然后分别沿X、Y轴扫描图像。
当沿Y轴扫描时,一边扫描一边统计图像中蓝色像素点的个数,第一次扫描到蓝色像素点最多的行时停止扫描,并记录下蓝色像素点最多的行,然后以这行为基点,分别向上、向下扫描直到统计的像素点小于像素点阀值时,停止扫描,记录上下行的Y轴坐标PY2,PY1,I=(PY1:
PY2,:
:
)就为Y轴方向的车牌区域,代码如下:
Blue_y=zeros(y,1);
fori=1:
y
forj=1:
xif((myI(i,j,1)<=48)&&((myI(i,j,2)<=100)&&(myI(i,j,2)>=40))&&((myI(i,j,3)<=200)&&(myI(i,j,3)>=80)))
Blue_y(i,1)=Blue_y(i,1)+1;%统计蓝色像素点
end
end
end
[tempMaxY]=max(Blue_y);%
PY1=MaxY;%
while((Blue_y(PY1,1)>=Y_threshlow)&&(PY1>1))%
PY1=PY1-1;
end
PY2=MaxY;
while((Blue_y(PY2,1)>=Y_threshlow)&&(PY2 PY2=PY2+1; end PY1,PY2figure (2),subplot(1,2,1),plot(Blue_y),title('行方向的蓝色像素点统计');gridon IY=I(PY1: PY2,: : ); figure (2),subplot(1,2,2),imshow(IY),title('行方向车牌区域'); 运行结果如下: 同理可得X轴方向的车牌区域: 两者结合可提取出完整的车牌区域: 7.3.3车牌图像灰度化 由于车牌底色跟上面的字符的颜色对比度很大,所以将RGB图像转化为灰度图时,车牌底色跟字符的灰度值也会相差很大,这样就可以很明显的显现出车牌区域,便于后续处理。 本系统使用的是MATLAB内的灰度图转换函数rgb2gray(),其图像灰度值计算公式为: G=0.299R+0.578G+0.114B; 程序源代码为: bw=rgb2gray(I);figure(6),imshow(bw);title(‘灰度图像’); 运行结果为: 7.3.4车牌倾斜校正 由于摄像头拍摄角度的不同,可能使拍摄的车牌图片也发生倾斜,为了图像的后续处理以及很好的去识别字符,需对提取的带有倾斜的车牌图像进行校正。 本系统采用的办法是,首先用radon算法进行倾斜角度计算,然后根据倾斜角对图片精选修正,从而得到水平方向一致的图片,利于后期的分割识别。 代码如下: I=edge(I);% theta=1: 180; [R,xp]=radon(I,theta); [I,J]=find(R>=max(max(R)));% bw=imrotate(bw,qingxiejiao,'bilinear','crop');figure,imshow(bw);title('车牌倾斜'); 运行结果如下: 7.3.5车牌图像处理 对车牌灰度图像的处理主要有二值化、腐蚀、去除干扰、膨胀、擦除、取反,都可以直接使用图像工具箱的图像处理函数。 经过以上处理过程后可以得到带边框的白底黑字的车牌图片,但是由于还存在车牌的边框,需要对其进行二次的裁剪,裁剪方法跟上面阐述的提取彩色车牌方法相似,先将图片水平垂直投影,然后统计黑色像素点,找到字符边缘进行裁剪,得到除去边框的白底黑字的车牌照。 代码如下: SE=ones(3,3); bw=im2bw(bw);figure,imshow(bw);title('二值化'); bw=imerode(bw,SE);figure,imshow(bw);title('腐蚀'); bw=bwmorph(bw,'clean',inf); bw=bwmorph(bw,'hbreak',inf); bw=bwmorph(bw,'spur',inf); bw=imdilate(bw,SE);figure,imshow(bw);title('膨胀'); bw=bwareaopen(bw,threshold);figure,imshow(bw);title('擦除'); bw=~bw;figure,imshow(bw);title('颜色取反'); bw=touying(bw);figure;imshow(bw);title('投影'); 运行结构如下: 7.3.6字符分割 对二次裁剪的车牌图像进行水平垂直投影,计算水平垂直峰,检测合理的字符高宽比.可用与区域分割相同的方法进行峰值的删除和合并.但在字符切割时,往往由于阈值取得不好,导致字符切割不准确,针对这种情况,可以由车牌格式的先验知识,对切割出的字符宽度进行统计分析,用以指导切割。 代码如下: [y,x]=size(imfenge); histogram=sum(~imfenge); k=1; forh=1: x-1 if((histogram(1,h)<=shedingyuzhi)&&(histogram(1,h+1)>shedingyuzhi))||((h==1)&&histogram(1,h)>shedingyuzhi) fenge(1,k)=h; k=k+1; elseif((histogram(1,h)>shedingyuzhi)&&(histogram(1,h+1)<=shedingyuzhi))||((h==x-1)&&histogram(1,h)>shedingyuzhi) fenge(1,k)=h+1; k=k+1; end end k=k-1; if(sum(histogram(1,fenge(1,1): fenge(1,2))) fori=3: k fenge(1,i-2)=fenge(1,i); end end [mn]=size(fenge); fenge=fenge(1,1: 14); 运行结果如下: 7.3.7字符识别 目前字符识别方法主要有神经网络识别法和模板匹配法。 人工神经网络是模拟人脑思维功能和组织建立起来的数学模型,但总体来说其应用还是相对复杂的。 模板匹配法是将从待识别的图象或图象区域f(i,j)中提取的若干特征量与模板T(i,j)相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图象归于相应的类。 也可以计算图象与模板特征量之间的距离,用最小距离法判定所属类。 本系统使用的是较为简单的模板匹配法来识别字符的。 首先将待识别字符的图像进行归一化处理,使其长宽与模板字符图像长宽一致,模板使用的是80*160的图片尺寸,待识别字符图像归一化代码为: xiuzhenghanzi=imresize(han_zi,[80160],'bilinear'); xiuzhengzimu=imresize(zi_mu,[80160],'bilinear'); xiuzhengzm_sz_1=imresize(zm_sz_1,[80160],'bilinear'); xiuzhengzm_sz_2=imresize(zm_sz_2,[80160],'bilinear'); xiuzhengzm_sz_3=imresize(zm_sz_3,[80160],'bilinear'); xiuzhengzm_sz_4=imresize(zm_sz_4,[80160],'bilinear'); xiuzhengzm_sz_5=imresize(zm_sz_5,[80160],'bilinear'); 待识别字符图像与模板字符图像长宽一致以后,就可以用带识别字符图像与模板字符图像进行匹配,具体过程为: 建立模板字库表 读取分割出来的字符 第一个字符与模板中的汉字模板进行匹配 第二个字符与模板中的字母模板进行匹配 求待识别字符与模板字符的相关系数,相关系数越大,说明其相似度越大 识别完成,输出此模板对应值 后5个字符与模板中的字母与数字模板进行匹配 字符匹配代码为: comp=[]; forn=1: num_letras sem=corr2(xiuzhengzifu,mubanzifu); %利用corr2()函数求待识别字符图像与模板图像的相关系数 comp=[compsem];%将相关系数的值赋给comp end xiangguan=find(comp==max(comp));%找出相关系数最大的值 msgbox(shibiejieguo,'识别结果');%显示识别结果 运行结果如下: 7.3.8语音播报识别结果 对字符正确识别之后,用事先对对每一个字符的录音根据对应字符顺序播放。 在对车牌区域识别出错、字体分割出错时程序暂停,并有语音提醒。 7.4数据存储与数据库查询 本系统使用的是MicrosoftSQLServer2000来实现车牌信息处理的。 数据存储主要是车牌信息的存储和出入时间存储,实现车辆信息自动登记;数据库查询主要是在数据库中查找识别的车牌信息,然后由计算机自动判别是被车辆是不是属于所属地区。 首先是建立数据库,数据库名设为Study,接着需要在数据库中建立两个表Churujilu和Zhuceyonghu,表Churujilu主要是存储识别的车辆信息和相应的出入时间,表Zhuceyonghu主要是所属地区车辆信息的登记,包括车牌号和车主,用于查询。 然后是建立ODBC数据源,命名为DBTEST,使用ODBC数据源来连接数据库,连接数据库代码为: sourceName='DBTEST';%获取数据源 Timeout=logintimeout(5);%允许登陆连接时间最长为5s conn=database(sourceName,'sa','');%获取数据库连接对象 fprintf('\n数据库连接状态\n'); disp(ping(conn));%显示测试数据库连接状态 运行结果为: 再然后是将车牌信息和当时时间一起写入数据库,写入数据时使用的是insert()函数,具体代码如下: insert(conn,'Study.dbo.Churujilu',{'Chepaihao','Shijian'},{shibiejieguo,datestr(now)}); %将识别结果和当时的时间分别存入到Study数据库的Churujilu表中的Chepaihao和Shijian两列中 当识别完车牌“桂APC322”后,将车牌信息和当时时间写入数据库的Churujilu表中,实现车辆信息自动登记,结果如图: 最后是在数据库中查询是否存在识别车辆的注册登记信息,使用的是SQL语句进行查询。 如果查询到与识别结果相同的车牌号,则返回其查询到的车辆信息,并弹出对话框“欢迎光临”,表示查找到相应信息;如果没有查询到,则MATLAB返回为字符串“NoData”,并弹出对话框“请下车登记”,表示没有查找到与识别车辆相匹配的信息。 具体代码为: curs=exec(conn,['selectChepaifromStudy.dbo.ZhuceyonghuwhereChepai='''''shibiejieguo'''']); %在Study数据库的Zhuceyonghu表中查找与识别结果相同的车牌号 e=fetch(curs);%用fetch()函数将查询结果从数据库传给MATLAB中的矩阵e a=e.data;%把矩阵e中的数据全部传给a a=char(a);%把a转化为char型 disp(a);%在MATLAB中显示a里面的所有数据,即查询结果信息 ifstrcmp('NoData',a)%将查询返回的信息与识别结果比较 msgbox('请下车登记','查询结果’); %如果没有查询到则显示“请下车登记” else msgbox('欢迎光临','查询结果’); %如果查询到识别车辆则显示“欢迎光临” end 车牌“桂APC322”识别完后,查询结果为: 因为在前面数据库的Zhuceyonghu表中,已有此车牌的注册登记信息,所以查询结果为“欢迎光临”。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 车牌 识别 过程