找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3144|回复: 1
收起左侧

matlab车牌识别代码 出现错误怎么弄?

[复制链接]
ID:198530 发表于 2017-5-10 21:54 | 显示全部楼层 |阅读模式
  1.                                 
  2. function [d]=main(jpg)
  3. close all
  4. clc
  5. I=imread('car1.jpg');
  6. figure(1),imshow(I);title('原图')
  7. I1=rgb2gray(I);
  8. figure(2),subplot(1,2,1),imshow(I1);title('灰度图');
  9. figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');
  10. I2=edge(I1,'roberts',0.15,'both');
  11. figure(3),imshow(I2);title('robert算子边缘检测')
  12. se=[1;1;1];
  13. I3=imerode(I2,se);
  14. figure(4),imshow(I3);title('腐蚀后图像');
  15. se=strel('rectangle',[25,25]);
  16. I4=imclose(I3,se);
  17. figure(5),imshow(I4);title('平滑图像的轮廓');
  18. I5=bwareaopen(I4,2000);
  19. figure(6),imshow(I5);title('从对象中移除小对象');
  20. [y,x,z]=size(I5);
  21. myI=double(I5);
  22. tic
  23. Blue_y=zeros(y,1);
  24. for i=1:y
  25.     for j=1:x
  26.              if(myI(i,j,1)==1)
  27.   
  28.                 Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计
  29.             end  
  30.      end      
  31. end
  32. [temp MaxY]=max(Blue_y);%Y方向车牌区域确定
  33. PY1=MaxY;
  34. while ((Blue_y(PY1,1)>=5)&&(PY1>1))
  35.         PY1=PY1-1;
  36. end   
  37. PY2=MaxY;
  38. while ((Blue_y(PY2,1)>=5)&&(PY2<y))
  39.         PY2=PY2+1;
  40. end
  41. IY=I(PY1:PY2,:,:);
  42. %%%%%% X方向 %%%%%%%%%
  43. Blue_x=zeros(1,x);%进一步确定x方向的车牌区域
  44. for j=1:x
  45.      for i=PY1:PY2
  46.             if(myI(i,j,1)==1)
  47.                 Blue_x(1,j)= Blue_x(1,j)+1;               
  48.             end  
  49.      end      
  50. end
  51.   
  52. PX1=1;
  53. while ((Blue_x(1,PX1)<3)&&(PX1<x))
  54.        PX1=PX1+1;
  55. end   
  56. PX2=x;
  57. while ((Blue_x(1,PX2)<3)&&(PX2>PX1))
  58.         PX2=PX2-1;
  59. end
  60. PX1=PX1-1;%对车牌区域的校正
  61. PX2=PX2+1;
  62.   dw=I(PY1:PY2-8,PX1:PX2,:);
  63. t=toc;
  64. figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');
  65. figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')
  66. imwrite(dw,'dw.jpg');
  67. [filename,filepath]=uigetfile('dw.jpg','输入一个定位裁剪后的车牌图像');
  68. jpg=strcat(filepath,filename);
  69. a=imread('dw.jpg');
  70. b=rgb2gray(a);
  71. imwrite(b,'1.车牌灰度图像.jpg');
  72. figure(8);subplot(3,2,1),imshow(b),title('1.车牌灰度图像')
  73. g_max=double(max(max(b)));
  74. g_min=double(min(min(b)));
  75. T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值
  76. [m,n]=size(b);
  77. d=(double(b)>=T);  % d:二值图像
  78. imwrite(d,'2.车牌二值图像.jpg');
  79. figure(8);subplot(3,2,2),imshow(d),title('2.车牌二值图像')
  80. figure(8),subplot(3,2,3),imshow(d),title('3.均值滤波前')

  81. % 滤波
  82. h=fspecial('average',3);
  83. d=im2bw(round(filter2(h,d)));
  84. imwrite(d,'4.均值滤波后.jpg');
  85. figure(8),subplot(3,2,4),imshow(d),title('4.均值滤波后')

  86. % 某些图像进行操作
  87. % 膨胀或腐蚀
  88. % se=strel('square',3);  % 使用一个3X3的正方形结果元素对象对创建的图像进行膨胀
  89. % 'line'/'diamond'/'ball'...
  90. se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵
  91. [m,n]=size(d);
  92. if bwarea(d)/m/n>=0.365
  93.     d=imerode(d,se);
  94. elseif bwarea(d)/m/n<=0.235
  95.     d=imdilate(d,se);
  96. end
  97. imwrite(d,'5.膨胀或腐蚀处理后.jpg');
  98. figure(8),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后')

  99. % 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割
  100. d=qiege(d);
  101. [m,n]=size(d);
  102. figure,subplot(2,1,1),imshow(d),title(n)
  103. k1=1;k2=1;s=sum(d);j=1;
  104. while j~=n
  105.     while s(j)==0
  106.         j=j+1;
  107.     end
  108.     k1=j;
  109.     while s(j)~=0 && j<=n-1
  110.         j=j+1;
  111.     end
  112.     k2=j-1;
  113.     if k2-k1>=round(n/6.5)
  114.         [val,num]=min(sum(d(:,[k1+5:k2-5])));
  115.         d(:,k1+num+5)=0;  % 分割
  116.     end
  117. end
  118. % 再切割
  119. d=qiege(d);
  120. % 切割出 7 个字符
  121. y1=10;y2=0.25;flag=0;word1=[];
  122. while flag==0
  123.     [m,n]=size(d);
  124.     left=1;wide=0;
  125.     while sum(d(:,wide+1))~=0
  126.         wide=wide+1;
  127.     end
  128.     if wide<y1   % 认为是左侧干扰
  129.         d(:,[1:wide])=0;
  130.         d=qiege(d);
  131.     else
  132.         temp=qiege(imcrop(d,[1 1 wide m]));
  133.         [m,n]=size(temp);
  134.         all=sum(sum(temp));
  135.         two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));
  136.         if two_thirds/all>y2
  137.             flag=1;word1=temp;   % WORD 1
  138.         end
  139.         d(:,[1:wide])=0;d=qiege(d);
  140.     end
  141. end
  142. % 分割出第二个字符
  143. [word2,d]=getword(d);
  144. % 分割出第三个字符
  145. [word3,d]=getword(d);
  146. % 分割出第四个字符
  147. [word4,d]=getword(d);
  148. % 分割出第五个字符
  149. [word5,d]=getword(d);
  150. % 分割出第六个字符
  151. [word6,d]=getword(d);
  152. % 分割出第七个字符
  153. [word7,d]=getword(d);
  154. subplot(5,7,1),imshow(word1),title('1');
  155. subplot(5,7,2),imshow(word2),title('2');
  156. subplot(5,7,3),imshow(word3),title('3');
  157. subplot(5,7,4),imshow(word4),title('4');
  158. subplot(5,7,5),imshow(word5),title('5');
  159. subplot(5,7,6),imshow(word6),title('6');
  160. subplot(5,7,7),imshow(word7),title('7');
  161. [m,n]=size(word1);

  162. % 商用系统程序中归一化大小为 40*20,此处演示
  163. word1=imresize(word1,[40 20]);
  164. word2=imresize(word2,[40 20]);
  165. word3=imresize(word3,[40 20]);
  166. word4=imresize(word4,[40 20]);
  167. word5=imresize(word5,[40 20]);
  168. word6=imresize(word6,[40 20]);
  169. word7=imresize(word7,[40 20]);

  170. subplot(5,7,15),imshow(word1),title('1');
  171. subplot(5,7,16),imshow(word2),title('2');
  172. subplot(5,7,17),imshow(word3),title('3');
  173. subplot(5,7,18),imshow(word4),title('4');
  174. subplot(5,7,19),imshow(word5),title('5');
  175. subplot(5,7,20),imshow(word6),title('6');
  176. subplot(5,7,21),imshow(word7),title('7');
  177. imwrite(word1,'1.jpg');
  178. imwrite(word2,'2.jpg');
  179. imwrite(word3,'3.jpg');
  180. imwrite(word4,'4.jpg');
  181. imwrite(word5,'5.jpg');
  182. imwrite(word6,'6.jpg');
  183. imwrite(word7,'7.jpg');
  184. liccode=char(['0':'9' 'A':'Z' '苏豫陕鲁京辽浙']);  %建立自动识别字符代码表  
  185. SubBw2=zeros(40,20);
  186. l=1;
  187. for I=1:7
  188.       ii=int2str(I);
  189.      t=imread([ii,'.jpg']);
  190.       SegBw2=imresize(t,[40 20],'nearest');
  191.         if l==1                 %第一位汉字识别
  192.             kmin=37;
  193.             kmax=43;
  194.         elseif l==2             %第二位 A~Z 字母识别
  195.             kmin=11;
  196.             kmax=36;
  197.         else l>=3               %第三位以后是字母或数字识别
  198.             kmin=1;
  199.             kmax=36;
  200.         
  201.         end
  202.         
  203.         for k2=kmin:kmax
  204.             fname=strcat('F:\edge 下载\车牌识别3 第二版\车牌识别\程序与图像\字符模板\',liccode(k2),'.jpg');
  205.             SamBw2 = imread(fname);
  206.             for  i=1:40
  207.                 for j=1:20
  208.                     SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
  209.                 end
  210.             end
  211.            % 以上相当于两幅图相减得到第三幅图
  212.             Dmax=0;
  213.             for k1=1:40
  214.                 for l1=1:20
  215.                     if  ( SubBw2(k1,l1) > 0 | SubBw2(k1,l1) <0 )
  216.                         Dmax=Dmax+1;
  217.                     end
  218.                 end
  219.             end
  220.             Error(k2)=Dmax;
  221.         end
  222.         Error1=Error(kmin:kmax);
  223.         MinError=min(Error1);
  224.         findc=find(Error1==MinError);
  225.         Code(l*2-1)=liccode(findc(1)+kmin-1);
  226.         Code(l*2)=' ';
  227.         l=l+1;
  228. end
  229. figure(10),imshow(dw),title (['车牌号码:', Code],'Color','b');

  230. function [word,result]=getword(d)
  231. word=[];flag=0;y1=8;y2=0.5;
  232.     while flag==0
  233.         [m,n]=size(d);
  234.         wide=0;
  235.         while sum(d(:,wide+1))~=0 && wide<=n-2
  236.             wide=wide+1;
  237.         end
  238.         temp=qiege(imcrop(d,[1 1 wide m]));
  239.         [m1,n1]=size(temp);
  240.         if wide<y1 && n1/m1>y2
  241.             d(:,[1:wide])=0;
  242.             if sum(sum(d))~=0
  243.                 d=qiege(d);  % 切割出最小范围
  244.             else word=[];flag=1;
  245.             end
  246.         else
  247.             word=qiege(imcrop(d,[1 1 wide m]));
  248.             d(:,[1:wide])=0;
  249.             if sum(sum(d))~=0;
  250.                 d=qiege(d);flag=1;
  251.             else d=[];
  252.             end
  253.         end
  254.     end
  255. %end
  256.           result=d;
  257.          
  258.          
  259.           function e=qiege(d)
  260. [m,n]=size(d);
  261. top=1;bottom=m;left=1;right=n;   % init
  262. while sum(d(top,:))==0 && top<=m
  263.     top=top+1;
  264. end
  265. while sum(d(bottom,:))==0 && bottom>=1
  266.     bottom=bottom-1;
  267. end
  268. while sum(d(:,left))==0 && left<=n
  269.     left=left+1;
  270. end
  271. while sum(d(:,right))==0 && right>=1
  272.     right=right-1;
  273. end
  274. dd=right-left;
  275. hh=bottom-top;
  276. e=imcrop(d,[left top dd hh]);
复制代码


出现这样的错误怎么弄??

出现这样的错误怎么弄??
回复

使用道具 举报

ID:198530 发表于 2017-5-11 19:41 | 显示全部楼层
经过各位大神的知道问题解决了,就是在根目录下放一张名为car1的图片就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表