车牌识别系统Matlab算法实现

2023-11-04

标签: 车牌识别
2014-10-29 10:51 1408人阅读 评论(0) 收藏 举报
本文章已收录于:
分类:
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  2. % 字符分割模块算法  
  3. % 定位剪切后的彩色车牌图像--灰度--二值化--统一到黑底白字--去除上下边框  
  4. % --切割出最小范围--滤波--形态学处理--分割出7个字符  
  5.   
  6. % 去除上下边框算法:  
  7. % 1.黑白跳变小于阈值则被视为背景;2.连续白线大于某阈值则该白线被认为是背景  
  8. % 3.单行白色大于阈值则被认为是背景,考虑FLAG的值;  
  9. % 4.做完以上处理后,上边1/2 中搜索连续两条黑线,认为该黑线以上为背景;在下边1/2 中搜索连续两条黑线,认为该黑线以下为背景  
  10. % 归一化为 40*20 ,商用系统程序中归一化为 32*16 ,此处仅演示作用  
  11. function [d]=lpcseg(jpg)  
  12. I=imread('car1.jpg');  
  13. I1=rgb2gray(I);  
  14. I2=edge(I1,'robert',0.15,'both');  
  15. se=[1;1;1];  
  16. I3=imerode(I2,se);  
  17. se=strel('rectangle',[25,25]);  
  18. I4=imclose(I3,se);  
  19. I5=bwareaopen(I4,2000);  
  20. [y,x,z]=size(I5);  
  21. myI=double(I5);  
  22. tic  
  23.  white_y=zeros(y,1);  
  24.  for i=1:y  
  25.     for j=1:x  
  26.              if(myI(i,j,1)==1)   
  27.                 white_y(i,1)= white_y(i,1)+1;   
  28.             end    
  29.      end         
  30.  end  
  31.  [temp MaxY]=max(white_y);  
  32.  PY1=MaxY;  
  33.  while ((white_y(PY1,1)>=5)&&(PY1>1))  
  34.         PY1=PY1-1;  
  35.  end      
  36.  PY2=MaxY;  
  37.  while ((white_y(PY2,1)>=5)&&(PY2<y))  
  38.         PY2=PY2+1;  
  39.  end  
  40.  IY=I(PY1:PY2,:,:);  
  41.  white_x=zeros(1,x);  
  42.  for j=1:x  
  43.      for i=PY1:PY2  
  44.             if(myI(i,j,1)==1)  
  45.                 white_x(1,j)= white_x(1,j)+1;                 
  46.             end    
  47.      end         
  48.  end  
  49.     
  50.  PX1=1;  
  51.  while ((white_x(1,PX1)<3)&&(PX1<x))  
  52.        PX1=PX1+1;  
  53.  end      
  54.  PX2=x;  
  55.  while ((white_x(1,PX2)<3)&&(PX2>PX1))  
  56.         PX2=PX2-1;  
  57.  end  
  58.  PX1=PX1-1;  
  59.  PX2=PX2+1;  
  60.   dw=I(PY1:PY2-8,PX1:PX2,:);  
  61.  t=toc;   
  62. figure(1),subplot(3,2,1),imshow(dw),title('定位剪切后的彩色车牌图像')  
  63. imwrite(dw,'dw.jpg');  
  64. [filename,filepath]=uigetfile('dw.jpg','输入一个定位裁剪后的车牌图像');  
  65. jpg=strcat(filepath,filename);  
  66. a=imread(jpg);  
  67. %figure(1);subplot(3,2,1),imshow(a),title('1.定位剪切后的彩色车牌图像')  
  68. b=rgb2gray(a);  
  69. imwrite(b,'2.车牌灰度图像.jpg');  
  70. figure(1);subplot(3,2,2),imshow(b),title('2.车牌灰度图像')  
  71. g_max=double(max(max(b)));  
  72. g_min=double(min(min(b)));  
  73. T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值  
  74. [m,n]=size(b);  
  75. d=(double(b)>=T);  % d:二值图像  
  76. imwrite(d,'3.车牌二值图像.jpg');  
  77. figure(1);subplot(3,2,3),imshow(d),title('3.车牌二值图像')  
  78.   
  79. % 旋转  
  80. rotate=0;  
  81. d=imread('3.车牌二值图像.jpg');  
  82. bw=edge(d);  
  83. [m,n]=size(d);  
  84. theta=1:179;  
  85. % bw 表示需要变换的图像,theta 表示变换的角度  
  86. % 返回值 r 表示的列中包含了对应于 theta中每一个角度的 Radon 变换结果  
  87. % 向量 xp 包含相应的沿 x轴的坐标  
  88. [r,xp]=radon(bw,theta);  
  89. i=find(r>0);  
  90. [foo,ind]=sort(-r(i));  
  91. k=i(ind(1:size(i)));  
  92. [y,x]=ind2sub(size(r),k);  
  93. [mm,nn]=size(x);  
  94. if mm~=0 && nn~=0  
  95.     j=1;  
  96.     while mm~=1 && j<180 && nn~=0  
  97.         i=find(r>j);  
  98.         [foo,ind]=sort(-r(i));  
  99.         k=i(ind(1:size(i)));  
  100.         [y,x]=ind2sub(size(r),k);  
  101.         [mm,nn]=size(x);  
  102.         j=j+1;  
  103.     end  
  104.     if nn~=0  
  105.         if x   % Enpty matrix: 0-by-1 when x is an enpty array.  
  106.             x=x;  
  107.         else  % 可能 x 为空值  
  108.             x=90; % 其实就是不旋转  
  109.         end  
  110.         d=imrotate(d,abs(90-x)); % 旋转图像  
  111.         rotate=1;  
  112.     end  
  113. end  
  114. imwrite(d,'4.Radon 变换旋转后的二值图像.jpg');  
  115. figure(1),subplot(3,2,4),imshow(d),title('4.Radon 变换旋转后的二值图像')  
  116.   
  117. % 统一到白底黑字  
  118. [m,n]=size(d);  
  119. % flag=0 表示原来就是白底黑字,否则表示原来是黑底白字  
  120. flag=0;  
  121. c=d([round(m/3):m-round(m/3)],[round(n/3):n-round(n/3)]);  
  122. if sum(sum(c))/m/n*9>0.5  
  123.     d=~d;flag=1;  
  124. end  
  125. % 对反色后的图像预处理,整列几乎为白的认为是背景  
  126. if flag==1  
  127.     for j=1:n  
  128.         if sum(sum(d(:,j)))/m>=0.95  
  129.             d(:,j)=0;  
  130.         end  
  131.     end  
  132.     % 对以上处理后的图像再处理  
  133.     % 在左边 1/2 处找连续两条黑线,认为该黑线左边为背景;在右边 1/2 处找连续两条黑线,认为该黑线右边是背景  
  134.     % 左边 1/2  
  135.     jj=0;  
  136.     for j=1:round(n/2)  
  137.         if sum(sum(d(:,[j:j+0])))==0  
  138.             jj=j;  
  139.         end  
  140.     end  
  141.     d(:,[1:jj])=0;  
  142.     % 右边 1/2  
  143.     for j=n:-1:round(n/2)  
  144.         if sum(sum(d(:,[j-0:j])))==0  
  145.             jj=j;  
  146.         end  
  147.     end  
  148.     d(:,[jj:n])=0;  
  149. end  
  150. imwrite(d,'5.统一成黑底白字.jpg');  
  151. figure(1),subplot(3,2,5),imshow(d),title('5.背景色统一成黑底白字')  
  152. figure(2),subplot(5,1,1),imshow(d),title('5.黑底白字的二值车牌图像')  
  153.   
  154. % 去除上下边框  
  155. % STEP 1  黑白跳变小于阈值则被视为背景  
  156. % 上面 2/5  
  157. y1=10;  % y1: 跳变阈值  
  158. for i=1:round(m/5*2)  
  159.     count=0;jump=0;temp=0;  
  160.     for j=1:n  
  161.         if d(i,j)==1  
  162.             temp=1;  
  163.         else  
  164.             temp=0;  
  165.         end  
  166.         if temp==jump  
  167.             count=count;  
  168.         else  
  169.             count=count+1;  
  170.         end  
  171.         jump=temp;  
  172.     end  
  173.     if count<y1  
  174.         d(i,:)=0;  
  175.     end  
  176. end  
  177. % 下面 2/5  
  178. for i=3*round(m/5):m  
  179.     count=0;jump=0;temp=0;  
  180.     for j=1:n  
  181.         if d(i,j)==1  
  182.             temp=1;  
  183.         else  
  184.             temp=0;  
  185.         end  
  186.         if temp==jump  
  187.             count=count;  
  188.         else  
  189.             count=count+1;  
  190.         end  
  191.         jump=temp;  
  192.     end  
  193.     if count<y1  
  194.         d(i,:)=0;  
  195.     end  
  196. end  
  197. imwrite(d,'6.黑白跳变小于某阈值的行则被视为背景.jpg');  
  198. figure(2),subplot(5,1,2),imshow(d),title('6.黑白跳变小于某阈值的行则被视为背景')  
  199.   
  200. % STEP 2  单行白色大于阈值则被认为是背景,考虑 FLAG 的值  
  201. % 上面 2/5  
  202. y2=round(n/2); % y2: 阈值  
  203. for i=1:round(m/5*2)  
  204.     if flag==0  
  205.         temp=sum(d(i,:));y2=round(n/2);  
  206.         if temp>y2  
  207.             d(i,:)=0;  
  208.         end  
  209.     else  
  210.         temp=m-sum(d(i,:));y2=m-round(n/2);  
  211.         if temp<y2  
  212.             d(i,:)=0;  
  213.         end  
  214.     end  
  215. end  
  216. % 下面 2/5  
  217. for i=round(3*m/5):m  
  218.     if flag==0  
  219.         temp=sum(d(i,:));y2=round(n/2);  
  220.         if temp>y2  
  221.             d(i,:)=0;  
  222.         end  
  223.     else  
  224.         temp=m-sum(d(i,:));y2=m-round(n/2);  
  225.         if temp<y2  
  226.             d(i,:)=0;  
  227.         end  
  228.     end  
  229. end  
  230. imwrite(d,'7.单行白色点总数大于某阈值则该行被认为是背景.jpg');  
  231. figure(2),subplot(5,1,3),imshow(d),title('7.单行白色点总数大于某阈值则该行被认为是背景')  
  232. % STEP 3  单行白色大于阈值则被认为是背景,考虑 FLAG 的值  
  233. % 上面 2/5  
  234. y2=round(n/2); % y2: 阈值  
  235. for i=1:round(m/5*2)  
  236.     if flag==0  
  237.         temp=sum(d(i,:));y2=round(n/2);  
  238.         if temp>y2  
  239.             d(i,:)=0;  
  240.         end  
  241.     else  
  242.         temp=m-sum(d(i,:));y2=m-round(n/2);  
  243.         if temp<y2  
  244.             d(i,:)=0;  
  245.         end  
  246.     end  
  247. end  
  248. % 下面 2/5  
  249. for i=round(3*m/5):m  
  250.     if flag==0  
  251.         temp=sum(d(i,:));y2=round(n/2);  
  252.         if temp>y2  
  253.             d(i,:)=0;  
  254.         end  
  255.     else  
  256.         temp=m-sum(d(i,:));y2=m-round(n/2);  
  257.         if temp<y2  
  258.             d(i,:)=0;  
  259.         end  
  260.     end  
  261. end  
  262. imwrite(d,'8.单行白色点总数大于某阈值则该行被认为是背景.jpg');  
  263. figure(2),subplot(5,1,4),imshow(d),title('8.单行白色点总数大于某阈值则该行被认为是背景')  
  264. %  STEP 4 做完以上处理后,上边 1/2 中搜索连续两条黑线,认为该黑线以上为背景;  
  265. % 在下边 1/2 中搜索连续两条黑线,认为该黑线以下为背景  
  266. % 上边 1/2  
  267. for i=1:round(m/2)  
  268.     if sum(sum(d([i,i+0],:)))==0  
  269.         ii=i;  
  270.     end  
  271. end  
  272. d([1:ii],:)=0;  
  273. % 下边 1/2  
  274. for i=m:-1:round(m/2)  
  275.     if sum(sum(d([i-0:i],:)))==0  
  276.         ii=i;  
  277.     end  
  278. end  
  279. d([ii:m],:)=0;  
  280. imwrite(d,'9.搜索上下两条黑线后的结果.jpg');  
  281. figure(2),subplot(5,1,5),imshow(d),title('9.搜索上下两条黑线后的结果')  
  282.   
  283. % 反旋转  
  284. if rotate==1  
  285.     d=imrotate(d,-abs(x-90));  
  286. end  
  287. imwrite(d,'10.反旋转去毛刺后.jpg');  
  288. figure(3),subplot(3,2,1),imshow(d),title('10.反旋转去毛刺后')  
  289. % 切割处最小范围  
  290. d=qiege(d);e=d;  
  291. imwrite(d,'11.切割处最小范围.jpg');  
  292. figure(3),subplot(3,2,2),imshow(d),title('11.切割处最小范围')  
  293. figure(3),subplot(3,2,3),imshow(d),title('11.均值滤波前')  
  294.   
  295. % 滤波  
  296. h=fspecial('average',3);  
  297. d=im2bw(round(filter2(h,d)));  
  298. imwrite(d,'12.均值滤波后.jpg');  
  299. figure(3),subplot(3,2,4),imshow(d),title('12.均值滤波后')  
  300.   
  301. % 某些图像进行操作  
  302. % 膨胀或腐蚀  
  303. % se=strel('square',3);  % 使用一个3X3的正方形结果元素对象对创建的图像进行膨胀  
  304. % 'line'/'diamond'/'ball'...  
  305. se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵  
  306. [m,n]=size(d);  
  307. if bwarea(d)/m/n>=0.365  
  308.     d=imerode(d,se);  
  309. elseif bwarea(d)/m/n<=0.235  
  310.     d=imdilate(d,se);  
  311. end  
  312. imwrite(d,'13.膨胀或腐蚀处理后.jpg');  
  313. figure(3),subplot(3,2,5),imshow(d),title('13.膨胀或腐蚀处理后')  
  314.   
  315. % 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割  
  316. d=qiege(d);  
  317. [m,n]=size(d);  
  318. figure,subplot(2,1,1),imshow(d),title(n)  
  319. k1=1;k2=1;s=sum(d);j=1;  
  320. while j~=n  
  321.     while s(j)==0  
  322.         j=j+1;  
  323.     end  
  324.     k1=j;  
  325.     while s(j)~=0 && j<=n-1  
  326.         j=j+1;  
  327.     end  
  328.     k2=j-1;  
  329.     if k2-k1>=round(n/6.5)  
  330.         [val,num]=min(sum(d(:,[k1+5:k2-5])));  
  331.         d(:,k1+num+5)=0;  % 分割  
  332.     end  
  333. end  
  334. % 再切割  
  335. d=qiege(d);  
  336. % 切割出 7 个字符  
  337. y1=10;y2=0.25;flag=0;word1=[];  
  338. while flag==0  
  339.     [m,n]=size(d);  
  340.     left=1;wide=0;  
  341.     while sum(d(:,wide+1))~=0  
  342.         wide=wide+1;  
  343.     end  
  344.     if wide<y1   % 认为是左侧干扰  
  345.         d(:,[1:wide])=0;  
  346.         d=qiege(d);  
  347.     else  
  348.         temp=qiege(imcrop(d,[1 1 wide m]));  
  349.         [m,n]=size(temp);  
  350.         all=sum(sum(temp));  
  351.         two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));  
  352.         if two_thirds/all>y2  
  353.             flag=1;word1=temp;   % WORD 1  
  354.         end  
  355.         d(:,[1:wide])=0;d=qiege(d);  
  356.     end  
  357. end  
  358. % 分割出第二个字符  
  359. [word2,d]=getword(d);  
  360. % 分割出第三个字符  
  361. [word3,d]=getword(d);  
  362. % 分割出第四个字符  
  363. [word4,d]=getword(d);  
  364. % 分割出第五个字符  
  365. [word5,d]=getword(d);  
  366. % 分割出第六个字符  
  367. [word6,d]=getword(d);  
  368. % 分割出第七个字符  
  369. [word7,d]=getword(d);  
  370. subplot(5,7,1),imshow(word1),title('1');  
  371. subplot(5,7,2),imshow(word2),title('2');  
  372. subplot(5,7,3),imshow(word3),title('3');  
  373. subplot(5,7,4),imshow(word4),title('4');  
  374. subplot(5,7,5),imshow(word5),title('5');  
  375. subplot(5,7,6),imshow(word6),title('6');  
  376. subplot(5,7,7),imshow(word7),title('7');  
  377. [m,n]=size(word1);  
  378. % 商用系统程序中归一化大小为 32*16,此处演示  
  379. word1=imresize(word1,[40 20]);  
  380. word2=wordprocess(word2);  
  381. word3=wordprocess(word3);  
  382. word4=wordprocess(word4);  
  383. word5=wordprocess(word5);  
  384. word6=wordprocess(word6);  
  385. word7=wordprocess(word7);  
  386.   
  387.   
  388. subplot(5,7,15),imshow(word1),title('1');  
  389. subplot(5,7,16),imshow(word2),title('2');  
  390. subplot(5,7,17),imshow(word3),title('3');  
  391. subplot(5,7,18),imshow(word4),title('4');  
  392. subplot(5,7,19),imshow(word5),title('5');  
  393. subplot(5,7,20),imshow(word6),title('6');  
  394. subplot(5,7,21),imshow(word7),title('7');  
  395. imwrite(word1,'14.字符分割归一化后 1.jpg');  
  396. imwrite(word2,'14.字符分割归一化后 2.jpg');  
  397. imwrite(word3,'14.字符分割归一化后 3.jpg');  
  398. imwrite(word4,'14.字符分割归一化后 4.jpg');  
  399. imwrite(word5,'14.字符分割归一化后 5.jpg');  
  400. imwrite(word6,'14.字符分割归一化后 6.jpg');  
  401. imwrite(word7,'14.字符分割归一化后 7.jpg');  
  402.   
  403.   
  404. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  405. clc  
  406. word='';  
  407. word(1)=wordrec(word1);  
  408. word(2)=wordrec(word2);  
  409. word(3)=wordrec(word3);  
  410. word(4)=wordrec(word4);  
  411. word(5)=wordrec(word5);  
  412. word(6)=wordrec(word6);  
  413. word(7)=wordrec(word7);  
  414. clc  
  415. save I  'word1' 'word2' 'word3' 'word4' 'word5' 'word6' 'word7'  
  416. clear  
  417. load I;  
  418. load bp net;  
  419. word='';  
  420. word(1)=wordrec(word1);  
  421. word(2)=wordrec(word2);  
  422. word(3)=wordrec(word3);  
  423. word(4)=wordrec(word4);  
  424. word(5)=wordrec(word5);  
  425. word(6)=wordrec(word6);  
  426. word(7)=wordrec(word7);  
  427. word=strcat('识别结果:',word);  
  428. subplot(5,3,14),imshow([]),title(word,'fontsize',24)  
  429.   
  430. % 该子程序用于切割出最小范围  
  431. function e=qiege(d)  
  432. [m,n]=size(d);  
  433. top=1;bottom=m;left=1;right=n;   % init  
  434. while sum(d(top,:))==0 && top<=m  
  435.     top=top+1;  
  436. end  
  437. while sum(d(bottom,:))==0 && bottom>=1  
  438.     bottom=bottom-1;  
  439. end  
  440. while sum(d(:,left))==0 && left<=n  
  441.     left=left+1;  
  442. end  
  443. while sum(d(:,right))==0 && right>=1  
  444.     right=right-1;  
  445. end  
  446. dd=right-left;  
  447. hh=bottom-top;  
  448. e=imcrop(d,[left top dd hh]);  
  449.   
  450. % 分割字符  
  451. function [word,result]=getword(d)  
  452. word=[];flag=0;y1=8;y2=0.5;  
  453. % if d==[]  
  454. %   word=[];  
  455. % else  
  456.     while flag==0  
  457.         [m,n]=size(d);  
  458.         wide=0;  
  459.         while sum(d(:,wide+1))~=0 && wide<=n-2  
  460.             wide=wide+1;  
  461.         end  
  462.         temp=qiege(imcrop(d,[1 1 wide m]));  
  463.         [m1,n1]=size(temp);  
  464.         if wide<y1 && n1/m1>y2  
  465.             d(:,[1:wide])=0;  
  466.             if sum(sum(d))~=0  
  467.                 d=qiege(d);  % 切割出最小范围  
  468.             else word=[];flag=1;  
  469.             end  
  470.         else  
  471.             word=qiege(imcrop(d,[1 1 wide m]));  
  472.             d(:,[1:wide])=0;  
  473.             if sum(sum(d))~=0;  
  474.                 d=qiege(d);flag=1;  
  475.             else d=[];  
  476.             end  
  477.         end  
  478.     end  
  479. %end  
  480.           result=d;  
  481.         
  482. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  483. % 该子程序用于字符归一化处理  
  484. function d=wordprocess(d)  
  485. [m,n]=size(d);  
  486. %top 1/3, bottom 1/3  
  487. for i=1:round(m/3)  
  488.     if sum(sum(d([i:i+0],:)))==0  
  489.         ii=i;d([1:ii],:)=0;  
  490.     end  
  491. end  
  492. for i=m:-1:2*round(m/3)  
  493.     if sum(sum(d([i-0:i],:)))==0  
  494.         ii=i;d([ii:m],:)=0;  
  495.     end  
  496. end  
  497. if n~=1  
  498.     d=qiege(d);  
  499. end  
  500. % d=..这个可以通过训练过程设置大小  
  501. % d=imresize(d,[32 16]); % 商用系统程序中归一划大小为:32*16  
  502. d=imresize(d,[40 20]);   
  503.   
  504.   
  505. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  506. % 编号:A-Z 分别为 1-26; 0-9 分别为 27-36;  
  507. % 京  津  沪  渝  港  澳  吉  辽  鲁  豫  冀  鄂  湘  晋  青  皖  苏  
  508. % 赣  浙  闽  粤  琼  台  陕  甘  云  川  贵  黑  藏  蒙  桂  新  宁  
  509. % 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59   
  510. % 60 61 62 63 64 65 66 67 68 69 70  
  511. % 使用 BP 网络  
  512. function word=wordrec(xx)  
  513. % clear  
  514. % clc  
  515. load bp net;  
  516. xx=im2bw(xx);xx=double(xx(:));  % 使用阈值将图像转换为二进制图像  
  517. a=sim(net,xx);  % 归一划为: 32*16,则 xx=512*1;  
  518. [val,num]=max(a);  
  519. if num<=26  
  520.     word=char(double('A')+num-1);  
  521. elseif num<=36  
  522.     word=char(double('0')+num-1-26);  
  523. else  
  524.     switch num  
  525.         case 37  
  526.             word='京';  
  527.         case 38  
  528.             word='津';  
  529.         case 39  
  530.             word='沪';  
  531.         case 40  
  532.             word='渝';  
  533.         case 41  
  534.             word='港';  
  535.         case 42  
  536.             word='澳';  
  537.         case 43  
  538.             word='吉';  
  539.         case 44  
  540.             word='辽';  
  541.         case 45  
  542.             word='鲁';  
  543.         case 46  
  544.             word='豫';  
  545.         case 47  
  546.             word='冀';  
  547.         case 48  
  548.             word='鄂';  
  549.         case 49  
  550.             word='湘';  
  551.         case 50  
  552.             word='晋';  
  553.         case 51  
  554.             word='青';  
  555.         case 52  
  556.             word='皖';  
  557.         case 53  
  558.             word='苏';  
  559.         case 54  
  560.             word='赣';  
  561.         case 55  
  562.             word='浙';  
  563.         case 56  
  564.             word='闽';  
  565.         case 57  
  566.             word='粤';  
  567.         case 58  
  568.             word='琼';  
  569.         case 59  
  570.             word='台';  
  571.         case 60  
  572.             word='陕';  
  573.         case 61  
  574.             word='甘';  
  575.         case 62  
  576.             word='云';  
  577.         case 63  
  578.             word='川';  
  579.         case 64  
  580.             word='贵';  
  581.         case 65  
  582.             word='黑';  
  583.         case 66  
  584.             word='藏';  
  585.         case 67  
  586.             word='蒙';  
  587.         case 68  
  588.             word='桂';  
  589.         case 69  
  590.             word='新';  
  591.         case 70  
  592.             word='宁';  
  593.     end  
  594. end  
  595.   
  596.   
  597.   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

车牌识别系统Matlab算法实现 的相关文章

  • 华北电力计算机专业排名,华电考研计算机专业排名

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1354计算机软件与理论359 1355计算机软件与理论340 1356计算机软件与理论334 1357计算机软件与理论329 1358计算机软件与理论326 1359计算机软件与理论324 1
  • C++/C++11中引用的使用

    引用 reference 是一种复合类型 compound type 引用为对象起了另外一个名字 引用类型引用 refer to 另外一种类型 通过将声明符写成 d的形式来定义引用类型 其中d是声明的变量名 一 一般引用 一般在初始化变量时

随机推荐

  • Cocos2dx on Qt

    讨论贴在这里 http www cocos2d x org boards 6 topics 8043 page 1 准备 glew 库 bin glew32 dll gt windows system32 include GL gt VC
  • STM32F103时钟配置流程

    知识点 系统复位后 HSI振荡器被选为系统时钟 当时钟源被直接或通过PLL间接作为系统时钟时 它将不能被停止 STM32F103的三个可以作为系统时钟的时钟源 分别是HSI HSE PLL 而PLL的时钟源是HSI 2 内部RC振荡器二分频
  • 华硕计算机cpu怎么超频怎么设置,内存和CPU超频操作_华硕 ROG Rampage VI Apex_主板评测-中关村在线...

    进阶操作 进BIOS可能很多人都是为了去给CPU和内存进行超频 首先按F7进入到高级模式 华硕的主板选择Extreme Tweaker选项卡 有的主板是AI Tweaker或者超频设置等名字 Extreme Tweaker选项卡 内存超频
  • 如何使用postman做接口测试

    常用的接口测试工具主要有以下几种 Postman 简单方便的接口调试工具 便于分享和协作 具有接口调试 接口集管理 环境配置 参数化 断言 批量执行 录制接口 Mock Server 接口文档 接口监控等功能 JMeter 开源接口测试及压
  • Python中is和==(is not和!=)的区别

    Python中有很多种运算符 本文主要记录一下is和 这两种运算符的区别 id 函数是查看该对象所在内存地址 每个对象都有对应的内存地址 如 is 用于判断两个变量引用对象是否为同一个 用于判断引用变量的值是否相等 类似于Java中的equ
  • 华为OD机试 - 按单词下标区间翻转文章内容(Java)

    题目描述 给定一段英文文章片段 由若干单词组成 单词间以空格间隔 单词下标从0开始 请翻转片段中指定区间的单词顺序并返回翻转后的内容 例如给定的英文文章片段为 I am a developer 翻转区间为 0 3 则输出 developer
  • HJ26 字符串排序

    Powered by NEFU AB IN Link 文章目录 HJ26 字符串排序 题意 思路 代码 HJ26 字符串排序 题意 编写一个程序 将输入字符串中的字符按如下规则排序 规则 1 英文字母从 A 到 Z 排列 不区分大小写 如
  • PCL 计算点云法向量并显示

    目录 一 算法原理 1 法向量估计 2 法向量定向 3 表面曲率 4 参考文献 5 法向量定向的理解 6 CloudCompare 二 pcl Normal的定义 三 pcl Normal的几种输出方式 四 计算法线并显示 1 计算输入点云
  • 单点登录(简单的实现)

    假设现在有两个域名 分别为 分别记为client1 client2 client1 com client2 com 一个认证服务器 域名 ssoserver com client1 client2都需要登陆后才能访问到数据 现在想要实现cl
  • 76-C语言-输入班级学生的姓名和三科成绩,按总分排名

    问题 输入50分学生的姓名和三科成绩 按降序输出名字和总分 成绩相同的并列排名 思路 因为要学生排名 且一个学生有姓名 成绩 以及总分 所以弄一个学生的结构体 有多少学生 就输入该结构体的数组 一个for循环 给每个学生赋值 排序 降序 用
  • 【c++中的细节问题】关于typedef的详细用法

    请见 C C typedef用法详解 真的很详细 superhoy的专栏 CSDN博客 c typedef
  • 3.Linux文件管理和 I/O 重定向

    Linux文件管理和 I O 重定向 Linux文件系统目录结构 常见目录说明 根目录 一般根目录下只存放目录 在Linux下有且只有一个根目录 所有的东西都是从这里开始 当你在终端里输入 home 你其实是在告诉电脑 先从 根目录 开始
  • 利用多线程批Put方式压测HBase

    利用多线程批Put方式压测HBase 背景 在正式上生产之前 一定要对集群的组件做稳定性和性能压测 这是常识 这种压测当然不能指望那些只会鼠标点几下网页并经常指责前端页面样式有bug的测试去做 这种稍微有点技术含量的事情 她们其实有心无力
  • Mybatis中的#号与$符号的区别

    1 变量名 可以进行预编译 类型匹配等操作 2 变量名 会转化为jdbc的类型 3 变量名 不进行数据类型匹配 直接替换 4 方式能够很大程度防止sql注入 5 方式无法方式sql注入 6 方式一般用于传入数据库对象 例如传入表名 7 尽量
  • List取交集、并集、差集

    突然被面试官问到这样一个问题 List怎么取交集 我想了一会后说道双重循环 自己都觉得面试官想要的答案应该不是这个 效率太低了 后面问面试官答案 面试官告诉我可以将其中一个llist转成一个map或set 再遍历第二个list的时候判断 m
  • Vision Transformer

    A N I MAGE IS W ORTH 16 X 16 W ORDS TRANSFORMERS FOR I MAGE R ECOGNITION AT S CALE 原文链接地址 https arxiv org abs 2010 11929
  • shell学习:从ini文件中读取参数

    打算编写一个shell脚本来自动备份网站 需要从配置文件中读取一些参数 比如数据库名称 用户名和密码等 我分析了一下wdcp自带的数据库备份脚本mysqlbackup sh 里面仅仅从文件mrpw conf中读取了数据库密码 只用到了cat
  • 面试前需考虑的25个问题

    我曾经在The Simple Dollar上提到自己过去曾组织了大量面试工作 虽然我招聘的通常是技术类职位 但实际问到的问题 因此是有实际价值的 都是无关技术的 一个好的面试问题能使应聘者的本性显露出来 诚实 可信 反应敏锐等等 长期以来
  • vue项目嵌入iframe后访问后端报错

    项目场景 最近的项目中 开发的项目中需要使用到另外的一个即时通讯im项目 当时使用ifram标签进行嵌入 跳转失败 问题描述 在使用ifram进行嵌入后 刷新页面 ifram的地址会直接覆盖掉父类地址进行网页跳转 原因分析 在嵌入的src地
  • 车牌识别系统Matlab算法实现

    车牌识别系统Matlab算法实现 标签 车牌识别 2014 10 29 10 51 1408人阅读 评论 0 收藏 举报 本文章已收录于 分类 机器学习 21 作者同类文章 X plain view plain copy print