基于单片机的车牌识别系统_第1页
基于单片机的车牌识别系统_第2页
基于单片机的车牌识别系统_第3页
基于单片机的车牌识别系统_第4页
基于单片机的车牌识别系统_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、. function d=main(jpg)I=imread(car.jpg);figure(1),imshow(I);title(原图);I1=rgb2gray(I); %将真彩色图像转换为灰度图像figure(2),subplot(1,2,1),imshow(I1);title(灰度图);figure(2),subplot(1,2,2),imhist(I1);title(灰度图直方图);I2=edge(I1,robert,0.08,both); %高斯滤波器,方差为0.08figure(3),imshow(I2);title(robert算子边缘检测)se=1;1;1;I3=imerode

2、(I2,se); %图像的腐蚀figure(4),imshow(I3);title(腐蚀后图像);se=strel(rectangle,40,40); %构造结构元素,以长方形构造一个seI4=imclose(I3,se); %对图像实现闭运算,闭运算也能平滑图像的轮廓,但与开运算相反,它一般融合窄的缺口和细长的弯口,去掉小洞,填补轮廓上的缝隙。figure(5),imshow(I4);title(平滑图像的轮廓);I5=bwareaopen(I4,2000); %从二进制图像中移除所有少于p像素的连接的组件(对象),产生另一个二进制图像figure(6),imshow(I5);title(从

3、对象中移除小对象);y,x,z=size(I5); %返回I5各维的尺寸,并存储在变量y、x、z中myI=double(I5); %换成双精度数值 %begin横向扫描tic %计算tic与toc之间程序的运行时间 Blue_y=zeros(y,1); %产生y*1的全0矩阵 for i=1:y for j=1:x if(myI(i,j,1)=1) %如果myI(i,j,1)即myI图像中坐标为(i,j)的点为蓝色 %则Blue_y的相应行的元素white_y(i,1)值加1 Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计 end end end temp MaxY=m

4、ax(Blue_y);%temp为向量white_y的元素中的最大值,MaxY为该值的索引( 在向量中的位置) PY1=MaxY; while (Blue_y(PY1,1)=120)&(PY11) PY1=PY1-1; end PY2=MaxY; while (Blue_y(PY2,1)=40)&(PY2y) PY2=PY2+1; end IY=I(PY1:PY2,:,:);%IY为原始图像I中截取的纵坐标在PY1:PY2之间的部分 %end横向扫描 %begin纵向扫描 Blue_x=zeros(1,x);%进一步确定x方向的车牌区域 for j=1:x for i=PY1:PY2 if(m

5、yI(i,j,1)=1) Blue_x(1,j)= Blue_x(1,j)+1; end end end PX1=1; while (Blue_x(1,PX1)3)&(PX1x) PX1=PX1+1; end PX2=x; while (Blue_x(1,PX2)PX1) PX2=PX2-1; end %end纵向扫描 PX1=PX1-2;%对车牌区域的校正 PX2=PX2+2; dw=I(PY1:PY2,:,:); t=toc; figure(7),subplot(1,2,1),imshow(IY),title(行方向合理区域);figure(7),subplot(1,2,2),imshow

6、(dw),title(定位剪切后的彩色车牌图像)imwrite(dw,dw.jpg); %将图像数据写入到图像文件中filename,filepath=uigetfile(dw.jpg,输入一个定位裁剪后的车牌图像); %读取jpg=strcat(filepath,filename); %将数组filepath,filename水平地连接成单个字符串,并保存于变量jpg中a=imread(dw.jpg); %读取图片文件中的数据b=rgb2gray(a); %将真彩色图像转换为灰度图像imwrite(b,1.车牌灰度图像.jpg); %将图像数据写入到图像文件中figure(8);subplo

7、t(3,2,1),imshow(b),title(1.车牌灰度图像)g_max=double(max(max(b); %换成双精度数值g_min=double(min(min(b); %换成双精度数值T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值m,n=size(b); %返回矩阵b的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数。 d=(double(b)=T); % d:二值图像imwrite(d,2.车牌二值图像.jpg); %将图像数据写入到图像文件中figure(8);subplot(3,2,2),imshow(d),ti

8、tle(2.车牌二值图像)figure(8),subplot(3,2,3),imshow(d),title(3.均值滤波前)% 滤波h=fspecial(average,3); %建立预定义的滤波算子,average指定算子的类型,3为相应的参数d=im2bw(round(filter2(h,d); %转换为二值图像imwrite(d,4.均值滤波后.jpg); %将图像数据写入到图像文件中figure(8),subplot(3,2,4),imshow(d),title(4.均值滤波后)% 某些图像进行操作% 膨胀或腐蚀% se=strel(square,3); % 使用一个3X3的正方形结果

9、元素对象对创建的图像膨胀% line/diamond/ball.se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵m,n=size(d); %返回矩阵b的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数if bwarea(d)/m/n=0.365 %计算二值图像中对象的总面积 d=imerode(d,se); %图像的腐蚀elseif bwarea(d)/m/n=0.235 %计算二值图像中对象的总面积 d=imdilate(d,se); %实现膨胀操作endimwrite(d,5.膨胀或腐蚀处理后.jpg

10、); %将图像数据写入到图像文件中figure(8),subplot(3,2,5),imshow(d),title(5.膨胀或腐蚀处理后)% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割d=qiege(d); %切割m,n=size(d); %返回矩阵b的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数figure,subplot(2,1,1),imshow(d),title(n)k1=1;k2=1;s=sum(d);j=1;while j=n while s(j)=0 j=j+1; end k1=j; while s(j)=0 & j=roun

11、d(n/6.5) val,num=min(sum(d(:,k1+5:k2-5); d(:,k1+num+5)=0; % 分割 endend% 再切割d=qiege(d);% 切割出 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 widey2 flag=1;word1=temp; % WORD 1 end d(:,1:wide)=0;d=qiege(d); endend% 分割出第二个字符word2,d=ge

12、tword(d);% 分割出第三个字符word3,d=getword(d);% 分割出第四个字符word4,d=getword(d);% 分割出第五个字符word5,d=getword(d);% 分割出第六个字符word6,d=getword(d);% 分割出第七个字符word7,d=getword(d);figure(9),imshow(word1),title(1);figure(10),imshow(word2),title(2);figure(11),imshow(word3),title(3);figure(12),imshow(word4),title(4);figure(13),

13、imshow(word5),title(5);figure(14),imshow(word6),title(6);figure(15),imshow(word7),title(7);m,n=size(word1); %返回矩阵b的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数word1=imresize(word1,40 20);% 商用系统程序中归一化大小为 40*20,此处演示word2=imresize(word2,40 20); %对图像做缩放处理,高40,宽20word3=imresize(word3,40 20);word4=imresize(word4,40

14、 20);word5=imresize(word5,40 20);word6=imresize(word6,40 20);word7=imresize(word7,40 20);figure(16),subplot(3,7,8),imshow(word1),title(1);subplot(3,7,9),imshow(word2),title(2);subplot(3,7,10),imshow(word3),title(3);subplot(3,7,11),imshow(word4),title(4);subplot(3,7,12),imshow(word5),title(5);subplot

15、(3,7,13),imshow(word6),title(6);subplot(3,7,14),imshow(word7),title(7);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 苏豫陕鲁); %建立自动识别字符代码表,将t0:9 A:Z 苏豫陕鲁多个字符串组成一个字符数组,每行对应一个字符串,字符数

16、不足的自动补空格SubBw2=zeros(40,20); %产生40*20的全0矩阵l=1;for I=1:7 ii=int2str(I); %转换为串 t=imread(ii,.jpg); %读取图片文件中的数据 SegBw2=imresize(t,40 20,nearest); %对图像做缩放处理,高40,宽20,nearest: 这个参数,是默认的, 即改变图像尺寸时采用最近邻插值算法 if l=1 %第一位汉字识别 kmin=37; kmax=40; elseif l=2 %第二位 AZ 字母识别 kmin=11; kmax=36; else l=3 %第三位以后是字母或数字识别 km

17、in=1; kmax=36; end for k2=kmin:kmax fname=strcat(字符模板,liccode(k2),.jpg); %把一个行向量转化成字符串 SamBw2 = imread(fname); %读取图片文件中的数据 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 e

18、nd end Error(k2)=Dmax; end Error1=Error(kmin:kmax); MinError=min(Error1); findc=find(Error1=MinError); l=l+1;endfigure(17),subplot(3,1,2),imshow(dw),title (车牌号码: 陕 A B A 2 2 3); 实验原理牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别

19、算法等。某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。附录资料:不需要的可以自行删除测量平差程序设计角度(度分秒)到弧度AngleToRadian#define PI 3.14159265double AngleToRadian(double angle)int D,M;double S,radian,degree, angle,MS

20、;D=int(angle+0.3);MS=angle-D;M=int(MS)*100+0.3);S=(MS*100-M)*100;degree=D+M/60.0+S/3600.0;radian=degree*PI/180.0;return radian;注意:防止数据溢出,要加个微小量,例如0.3.弧度换角度(度分秒) RadianToAngle#define PI 3.14159265double RadianToAngle(double radian)int D,M;double S,radian,degree,MS,angle;degree=radian*180/PI;D=int(deg

21、ree);MS=degree-D;M=int(MS*60);S=(MS*60-M)*60;angle=D+M/100.0+S/10000.0;return angle;已知两点求坐标方位角Azimuth#include double Azimuth(double xi,double yi,double xj,double yj)double Dx,Dy,S,T;Dx=xj-xi;Dy=yj-yi;S=sqrt(Dx*Dx+Dy*Dy);if(S1e-10) return 0;T=asin(Dy/S);if(Dx0&(Dy0)|T0) T=2*PI+T;return T;4.开辟二维数组的动态空

22、间的宏#include #define NewArray2D(type,A,i,n,m)A=(type*)malloc(n*sizeof(type*); for(i=0;im;i+) Ai=(type*)malloc(m*sizeof(type); 5.释放开辟的二维数组的空间#define FreeSpace(A,i,m)for(i=0;im;i+) free(Ai); free(A); 注意:释放空间与开辟空间相反,释放空间是先释放列,后释放行.6.矩阵求转置transformmatrixvoid transformmatrix(double *A,double *B,int i,int

23、j)int m,n;for(m=0;m=i;m+)for(n=0;n=j;n+)Bnm=Amn:7.矩阵相乘(mulmatrix)void mulmatrix(double *A,double *B,double *C,int i,int j,int k)int m,n,p;for(m=0;mi;m+)for(n=0;nj;n+)Cmn=0;for(p=0;pk;p+)Cmn+=Amp*Bpn:8.矩阵求逆(countermatrix)#include void countermatrix(double *T, double *s, double *r, double *Q,double *N

24、, double *rt,int n)for(i=0;in;i+)s=Nii;for(k=0;ki;k+)s-=Tki*Tki;Tii=sqrt(s)for(j=i+1;jn;j+)s=Nij;for(k=0;ki;k+)s-=Tki*Tkj;Tij=s/Tii;for(i=0;in;i+)for(j=0;j=0;i+)rii=1/Tii;for(j=i+1;jn;j+)s=0;for(k=i;kj-1;k+)s-=rik*Tkj;rij=s/Tii;for(i=0;in;i+)for(j=0;jn;j+)rij=0;transformmatrix(r,rt,n,n)mulmatrix(r,r

25、t,Q,n,n)9.平差主程序之读入数据typedef struct POINTchar name8;double x,y;int type;POINT;typedef struct READVALUEPOINT *begin;POINT *end;double value;READVALUE;POINT *GETPOINT(char *name,POINT *pPoint,int nPoint)int i;for(i=0;inPoint;i+)if (strcmp(pP,name)=0)return (pPoint+i) for(i=0;i0)pPoint=(POINT*

26、)malloc(nDirect*sizeof(POINT);if(nDirect0)pDirect=(READVALUE*)malloc(nDirect*sizeof(READVALUE);if(nDistance0)pDistance=(READVALUE*)malloc(nDistance*sizeof(RAADVALUE);fscanf(fp,”%lf,%lf,%lfn”,&mo,&mf,&ms);for(i=0;inKnownPoint;i+)fscanf(fp,”%s,%lf,%lfn”,pP,&pPointi.x,&pPointi.y);type=1;for(

27、;inPoint;i+)pP=NULL; pPointi.x=0;pPointi.y=0;pPointi.type=0; for(i=0;inDirect;i+)fscanf(fp,”%s,%s,%lfn”,begin,end,&pDirecti.value);pDirecti.begin=GetPoint(begin,pPoint,nPoint);pDirecti.end=GetPoint(end,pPoint,nPoint);for(i=0;inDistance;i+)fscanf(fp,”%s,%s,%lfn”,begin,end,&pDistancei.value)

28、;pDistancei.begin=GetPoint(begin,pPoint,nPoint);pDistancei.end=GetPoint(end,pPoint,nPoint);fclose(fp);10.角度检验(checkangle)#include int checkangle(double angle)int M,S;double MS;if(angle=0&angle360)MS=angle-(int)(angle);if(M6)S=(int)(MS*1000);if(S%106)return 1;return 0;11.前方交会#define PI=3014159265/*此处

29、调用程序角度换弧度AngleToRadian*/Qianfang(double XE, double YE, double XF, double YF, doubleDEG, double DEF, double DFG, double DFE, double *DFE, double *DFG)double C,A,B;C=DGE-DGF;A=DEF-DEG;B=DFG-DFE;if(C-2*PI)|(C0&C-PI&CPI&C2*PI)XG=(XE/tan(B)+XF/tan(A)+YE-YF)/(1/tan(A)+ 1/tan(B);YG=(YE/tan(B)+YF/tan(A)-XE+

30、XF)/ (1/tan(A)+ 1/tan(B);12.坐标概算全方向法子函数取出观测方向GetAllDirectint GetAllDirect(char *name,int nDirect,READVALUE *pDirect, READVALUE *pStation)int i,nCount=0;for(i=0;iname,name)=0)pStationnCount.begin=p(pDirectnCount.begin;pStationnCount.end=p(pDirectnCount.end;pStationnCount.value=p(pDirectnCount.value;

31、nCount+;return nCount;坐标概算全方向法子程序实现流程(coordinate)coordinate (入口参数设置)READVALUE pStation50,pObject50;int nCount,i,j,k,m,n,p,nobject;for(i=0;i1)|( nCount=1)for(j=0;jtype=1)for(k=0;ktype=0) nobject=GetAllDirect(pStationj.end-name,nDirect,pDirect,pobject)m=-1;n=-1;for(p=0;pname,pP)=0)m=p; if(st

32、rcmp(pobjectp.end-name,pStationk.end-name)=0)n=p;if(m=0&n=0)pPointi=pStationk.end-pStationj.end;pStationj.end=pObjectm.value-pObjectn.value; Xe=pPointi.x; Ye=pPointi.y; Xf=pStationj.end-x; Yf=pStationj.end-y; Lef=pStationj.value; Leg=pStationk.value; Lfe=pObjectm.value; Lfg=pObjectn.value; Qianfang(

33、Xe,Xf,Ye,Yf,Lef,Leg,Lfe,Lfg,*Xg,*Yg;) pStationk.end-x=*xg; pStationk.end-y=*yg; pStationk.end.type=2; 13.坐标增量法(calcoordinate)子函数由端点名称得边长值的函数GetDistancedouble GetDistance(char *begin,char *end,int nDistance,READVALUE *pDistance)int i;for(i=0;iname,begin)=0&strcmp(pDistancei.end-name,end=0)|(strcmp(pD

34、istancei.begin-name,end)=0&strcmp(pDistancei.end,begin)=0)return pDistancei.value;return -1;/*函数取出观测方向GetAllDirect*/void calcoordinate(int nDirect,READVALUE *pDirect,int nDistace,READVALUE *pDistance,int nPoint,POINT *pPoint) int nPoint,nCount,nDirect,nDistance; int m=-1,i,j,k; double x1,y1,x2,y2,A0

35、,A,S,dx,dy; READVALUE*pDirect=NULL; READVALUE pStation50; for(i=0;i0) nCount=GetAllDirect(pP,nDirect,pDirect,pStation50); for(j=0;jtype0)m=j; if(m!=-1) for(k=0;ktype=0) x1=pPointi.x; y1=pPointi.y; x2=pStationj.end-x; y2=pStationj.end-y; A0=Bearing(x1,y1,x2,y2); A=A0-(DMSToRAD(pStationm.val

36、ue)-DMSToRAD(pStationk.value); if(A2*PI)A=A-2*PI; S=GetDistance(pPointi,pStationk.end,nDistance,pDistance); if(Sx=pPointi.x+dx; pStationk.end-y=pPointi.y+dy; pStationk.end-type=2; 14.高斯正反算高斯正算:#include #include #define PI 3.14159265double DMSToRAD(double dDMS)int L1,L2;double T,L3;L1=(int)(dDMS+0.3);L2=(int)(dDMS-L1)*100+0.3);L3=(dDMS-L1)*100-L2)*100;T=(L1+L2/60.0+L3/3600.0)*PI/180.0;return T;void PreGausePositive(double B,double L,double L0, double a, double b, double *N, double *l, double *c, double *t, double *X,double *B1) double a0,a2,a4,a6,a8,m0,m2,m4,m6,m8; double e,e1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论