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];