www.pudn.com > codebar.rar > barcognition.m


%%------------条码识别,建立宽度序列--------------%%% 
%EAN-13条码字符集特点:A/B子集为白开头黑结尾,C子集为黑开头白结尾 
%:一个字符由2个条和2个空构成,故A/B子集就是白黑白黑,C子集就是黑白黑白 
function [number,bar1]=barcognition(I,height,width) 
 
bar=zeros(1,width); 
znum = zeros(1,width); 
onum = zeros(1,width); 
%%%-----------------少数服从多数校正----------------%%% 
for i=1:height 
    for j=1:width 
        if(I(i,j)==0) 
            znum(1,j)=znum(1,j)+1;%统计每一列0的个数 
        else 
            onum(1,j)=onum(1,j)+1;%统计每一列1的个数 
        end 
    end 
end 
%%决定宽度序列的二进制码 
for i=1:width 
    if(znum(1,i)>onum(1,i)) 
        bar(1,i)=0; 
    else 
        bar(1,i)=1; 
    end 
end 
%00011000--010  
%1000000001100000--10000100 
%1111111001111100--1110110 
%1111100111111100--1101110 
%11000001111111000-1001110 
%1000111100000000--1011000 
%1100001111111000--1001110 
%11001100011--10101 
%001111111110011---0111101(3) 
%0011111001111111--0110111(8) 
%00000110000011111-0010011(2) 
%0011111111100111--0111101(3) 
%0011001111111111--0101111(6) 
%0011111110011111--0111011(7) 
%0011000--010 
%%--------------校正条形码宽度序列------------------%% 
%%%-------------------奇偶校正---------------------%%% 
zcout=0; 
ocout=0; 
count=1; 
bar1=zeros(1,width+10); 
for i=1:width 
    if(bar(1,i)==0) 
        if(ocout==1)       %删补,让它成偶数 
            bar1(1,count)=1;%补上1个1; 
            count=count+1; 
        elseif(ocout>8)    %4/5 
            for i=1:(ocout-8) 
                count=count-1; 
            end 
        end 
        ocout=0; 
        zcout=zcout+1; 
        bar1(1,count)=0;%累加0 
        count=count+1; 
    end 
    if(bar(1,i)==1) 
        if(zcout==1)        %判断前面有多少个0 
            bar1(1,count)=1;%补上1个1; 
            count=count+1; 
        elseif(zcout>8)     %多于8个的,删除多余的 
            for i=1:(ocout-8) 
                count=count-1; 
            end 
        end 
        zcout=0; 
        ocout=ocout+1;      %字符1计数 
        bar1(1,count)=1; 
        count=count+1; 
    end 
end 
number=count-1; 
 
%%-----------------字符集分类-------------------%% 
%开始数据(3,010),左侧数据(6),中间符(5,10101),右侧数据(6),结束符(3) 
data =zeros(1,59);  %起始符有3个字符 
ldata =0;           %白黑白黑 
count1=1; 
oflag=false; 
zflag=false; 
stflag=true; 
for i=1:number 
    if(stflag==true) 
        if(bar1(1,i)~=0)%判断是否为0,如果不是0则不开始统计数据 
            continue;%跳过去 
        else 
            stflag = false; 
        end             
    end 
    if(bar1(1,i)==0) 
        if(oflag==true) 
            count1=count1+1;%1切换到0,表示白到黑,换一种类型 
            oflag=false; 
        end 
        zflag=true; 
        data(1,count1)=data(1,count1)+1; 
        %count=count+1; 
    elseif(bar1(1,i)==1) 
        if(zflag==true) 
            count1=count1+1;   %换一种类型 
            zflag=false; 
        end 
        oflag=true; 
        data(1,count1)=data(1,count1)+1; 
        %count=count+1; 
    end 
end 
%[number] = findchar(a1,b1,a2,b2,pos) 
max = count1-1; 
%pos = 0; 
%[num,valid]=findchar(data(1,1),data(1,2),data(1,3),'head'); 
 
%左侧数据 
lnumber=0; 
pos =1; 
for i=4:4:24   
    [lnum,lvalid]=findchar(data(1,i),data(1,(i+1)),data(1,(i+2)),data(1,(i+3)),'left'); 
    lnumber=[lnumber lnum]; 
end 
%右侧数据function [number,valid] = findchar(a1,b1,a2,b2,pos) 
pos=3; 
rnumber=0; 
for i=33:4:53   
    [rnum,rvalid]=findchar(data(1,i),data(1,i+1),data(1,i+2),data(1,i+3),'right'); 
    rnumber=[rnumber rnum]; 
end 
number=[lnumber rnumber];