1. 程式人生 > 其它 >【車牌識別】基於matlab車輛出入庫計時系統【含Matlab原始碼 469期】

【車牌識別】基於matlab車輛出入庫計時系統【含Matlab原始碼 469期】

一、簡介

基於matlab車輛出入庫計時系統

二、原始碼

%-----------------------------出停車場---------------------------
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);  
tic  
 white_y=zeros(y,1);  
 for i=1:y  
    for j=1:x  
             if(myI(i,j,1)==1)   
                white_y(i,1)= white_y(i,1)+1;   
            end    
     end         
 end  
 [temp MaxY]=max(white_y);  
 PY1=MaxY;  
 while ((white_y(PY1,1)>=5)&&(PY1>1))  
        PY1=PY1-1;  
 end      
 PY2=MaxY;  
 while ((white_y(PY2,1)>=5)&&(PY2<y))  
        PY2=PY2+1;  
 end  
 IY=I(PY1:PY2,:,:);  
 white_x=zeros(1,x);  
 for j=1:x  
     for i=PY1:PY2  
            if(myI(i,j,1)==1)  
                white_x(1,j)= white_x(1,j)+1;                 
            end    
     end         
 end  
    
 PX1=1;  
 while ((white_x(1,PX1)<3)&&(PX1<x))  
       PX1=PX1+1;  
 end      
 PX2=x;  
 while ((white_x(1,PX2)<3)&&(PX2>PX1))  
        PX2=PX2-1;  
 end  
 PX1=PX1-2;  
 PX2=PX2+3;  
 dw=I(PY1:PY2-8,PX1:PX2,:);  
 t=toc;      
a=dw;  
b=rgb2gray(a);   
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);  
d=(double(b)>=T);  % d:二值影象  

% 濾波  
h=fspecial('average',3);  
d=im2bw(round(filter2(h,d)));  

  
% 某些影象進行操作  
% 膨脹或腐蝕  
% 使用一個3X3的正方形結果元素物件對建立的影象進行膨脹  
se=eye(2); 
[m,n]=size(d);  
if bwarea(d)/m/n>=0.365  
    d=imerode(d,se);  
elseif bwarea(d)/m/n<=0.235  
    d=imdilate(d,se);  
end  
  
% 尋找連續有文字的塊,若長度大於某閾值,則認為該塊有兩個字元組成,需要分割  
d=qiege(d);  
[m,n]=size(d);  
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<=n-1  
        j=j+1;  
    end  
    k2=j-1;  
    if k2-k1>=round(n/6.5)  
        [val,num]=min(sum(d(:,[k1+5:k2-5])));  
        d(:,k1+num+5)=0;  % 分割  
    end  
end  
% 再切割  
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 wide<y1   % 認為是左側干擾  
        d(:,[1:wide])=0;  
        d=qiege(d);  
    else  
        temp=qiege(imcrop(d,[1 1 wide m]));  
        [m,n]=size(temp);  
        all=sum(sum(temp));  
        two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));  
        if two_thirds/all>y2  
            flag=1;word1=temp;   % WORD 1  
        end  
        d(:,[1:wide])=0;d=qiege(d);  
    end  
end  

三、執行結果

四、備註

版本:2014a
完整程式碼或代寫加1564658423