www.pudn.com > codebar.rar > point2line.m
% Convert the PointList to Line(positive line and negative line);
% point2line(threthold,point,len),threthold is point space;point is
% vector with len column and one rows;
% Return: slope and some dot;
% positive slope,negative slope,py1=positive y1,ny1=negative y1
% Author:CaiLiangDa,YAXON,2007-10-31.
%function [slope,py,ny,linepara] = point2line(threthold,point,height,len)
function [slope,keyY,linepara] = point2line(threthold,point,height,len)
%threthold = 10;
count1 = 1;
count2 = 1;
count3 = 1;
temp1 = zeros(len,1);
temp2 = zeros(len,1);
temp3 = zeros(len,1);
plus = zeros(len,1);
minus = zeros(len,1);
valid = true;
for i=1:(height-threthold)
valid = true;
for j=1:threthold
if(point(i+j-1,1) == 0)
valid = false;
end
end
if(valid == true)
kk = (point(i+threthold-1) - point(i,1))/threthold;%斜率,间隔10
%采用高度间隔为分母,其实已经是偏向纵轴斜率的求取,就是默认条形码的边是竖的
if((kk > 0) && (kk < 1.51))
plus(count1,1)=kk;
temp1(count1,1)=i;%记录起点位置
count1=count1+1;
elseif((kk < 0)&&(kk > -1.51))
minus(count2,1)=kk;
temp2(count2,1) = i;
count2 = count2+1;
elseif(kk==0)%斜率为0,就是垂直
temp3(count3,1)=i;
count3 = count3+1;
end
end
end
count=[count1 count2 count3];
T1 = [0.2 0.3 0.4 0.5 0.7 0.8 0.9 0.95];%[0.8 0.9];
T2 = [1.8 1.7 1.6 1.5 1.3 1.2 1.1 1.05];%[1.2 1.1];
%%%---------四次实现对干扰斜率进行过滤---------%%%
%点数至少大于40个点否则,斜率无效,也就图形无效
%由于完全可能出现很强的干扰,所以通过求均值方法不是很有效
if(count1==max(count))
p_average = sum(plus(1:(count1-1)))/(count1-1);
for i =1:length(T1)
index1 = 1;
for j=1:(count1-1)
p_ratio = plus(j,1)/p_average;%ratio1
if((p_ratio>T1(i)) && (p_ratio 30)%40->30
P1 = 1/slope;
tmpcount = round(count1/2)-10;
py1 = temp1(tmpcount,1);%20->5,随机取一点不够准确
py1_ave = py1;
i_py1=temp1(tmpcount+1,1);
k_py1=temp1(tmpcount-1,1);
py1_flag = false;%开始时认为不存在这样的点
%%寻找连续三个点中的一点
for i=1:10
if((i_py1 == (py1+1))&&(k_py1 == (py1-1)))%存在连续的三点,组成一条直线
py1_ave = py1;
py1_flag = true;
break;
else
k_py1 = py1;
py1 = i_py1;
tmpcount = tmpcount+1;
i_py1=temp1(tmpcount,1);
end
end
tmpcount = round(count1/2)+10;
Limit = count1 -tmpcount;
py2 = temp1(tmpcount,1);
py2_ave = py2;
i_py2=temp1(tmpcount+1,1);%544
k_py2=temp1(tmpcount-1,1);
py2_flag = false;
%%在temp1中寻找连续三个点
for i=1:Limit
if((i_py2 == (py2+1))&&(k_py2 == (py2-1)))%存在连续的三点,组成一条直线
py2_ave = py2;
py2_flag = true;
break;
else
k_py2 = py2;
py2 = i_py2;
tmpcount = tmpcount+1;
i_py2=temp1(tmpcount,1);
end
end
if((py1_flag==true)&&(py2_flag==true))
i_P0=py1_ave-P1*point(py1_ave);%y=kx+p;
k_P0=py2_ave-P1*point(py2_ave);%y=kx+p;
P0=(i_P0+k_P0)/2;
linepara=[P1 P0];
valid = true;
end
%else
limit = round(count1/3);%取中间的三分之一为有效数据
EY = temp1(limit); %limit=30;
%EX = point(EY);
k_P0=EY-P1*point(EY);
for i=(limit+1):(count1-limit)
YY = temp1(i);
i_P0 = YY-P1*point(YY);
%XX = point(YY);
%EY = [EY YY];
%EX = [EX XX];
k_P0 = [k_P0 i_P0];
end
%linepara = polyfit(EX,EY,1); %曲线拟合
P0 = mean(k_P0);
linepara=[P1 P0];
valid = true;
%end
else
py1 = 1;%取第一点
py2 = 1;%取第一点
linepara = [1 1];
valid = false;
end
indx = count1;
elseif(count2==max(count))
m_average = sum(minus(1:(count2-1)))/(count2-1);
for i =1:length(T1)
index2 = 1;
for j=1:(count2-1)
m_ratio = minus(j,1)/m_average;%ratio1
if((m_ratio>T1(i)) && (m_ratio 30)
%py1 = temp2((round(count2/2)-10),1);
%py2 = temp2((round(count2/2)+10),1); %y轴坐标
P1 = 1/slope;
tmpcount = round(count2/2)-10;
py1 = temp2(tmpcount,1);%20->5,随机取一点不够准确
py1_ave = py1;
i_py1=temp2(tmpcount+1,1);
k_py1=temp2(tmpcount-1,1);
py1_flag = false;
%%寻找连续三个点中的一点
for i=1:10
if((i_py1 == (py1+1))&&(k_py1 == (py1-1)))%存在连续的三点,组成一条直线
py1_ave = py1;
py1_flag = true;
break;
else
k_py1 = py1;
py1 = i_py1;
tmpcount = tmpcount+1;
i_py1=temp2(tmpcount,1);
end
end
tmpcount = round(count2/2)+10;
py2 = temp2(tmpcount,1);
py2_ave = py2;
py2_flag = false;
i_py2=temp2(tmpcount+1,1);
k_py2=temp2(tmpcount-1,1);
%%寻找连续点中的一点
for i=1:10
if((i_py2 == (py2+1))&&(k_py2 == (py2-1)))%存在连续的三点,组成一条直线
py2_ave = py2;
py2_flag = true;
break;
else
k_py2 = py2;
py2 = i_py2;
tmpcount = tmpcount+1;
i_py2=temp2(tmpcount,1);
end
end
if((py1_flag==true)&&(py2_flag==true))
P1=slope;
i_P0=py1_ave-P1*point(py1_ave);%y=kx+p;
k_P0=py2_ave-P1*point(py2_ave);%y=kx+p;
P0=(i_P0+k_P0)/2;
linepara=[P1 P0];
end
%else
% limit = round(count2/3);
% EY = temp2(limit); %limit=30;pfy= polyfit y axes;
% EX = point(EY); %pfx= polyfit x axes;
% for i=(limit+1):(count2-limit)
% YY = temp2(i); %图像的y轴值
% XX = point(YY); %图像的x轴值
% EY = [EY YY];
% EX = [EX XX];
% end
limit = round(count2/3);%取中间的三分之一为有效数据
EY = temp2(limit); %limit=30;
%EX = point(EY);
k_P0=EY-P1*point(EY);
for i=(limit+1):(count2-limit)
YY = temp2(i);
i_P0 = YY-P1*point(YY);
%XX = point(YY);
%EY = [EY YY];
%EX = [EX XX];
k_P0 = [k_P0 i_P0];
end
%linepara = polyfit(EX,EY,1); %曲线拟合
P0 = mean(k_P0);
linepara=[P1 P0];
valid = true;
%valid = true;
% linepara = polyfit(EX,EY,1); %y = P0*x+P1;
%linepara1 = [P1 mean(P0)];
%end
else
py1 = 1;%取第一点
py2 = 1;
linepara = [1 1];
valid = false;
end
indx = count2;
elseif(count3==max(count))
slope = 0;
if(count3 > 30)
py1_ave = temp3((round(count3/2)-10),1);
py2_ave = temp3((round(count3/2)+10),1); %y轴坐标
limit = round(count3/3);
EY = temp3(limit); %limit=30;pfy= polyfit y axes;
EX = point(EY); %pfx= polyfit x axes;
for i=(limit+1):(count3-limit)
YY = temp3(i); %图像的y轴值
XX = point(YY); %图像的x轴值
EY = [EY YY];
EX = [EX XX];
end
P1 = 0;
%P0 = mean(temp3(limit:(count3-limit)));
P0=mean(EX);
%linepara = polyfit(EX,EY,1); %y = P0*x+P1; end
linepara = [P1 P0];
valid = true;
else
py1 = 1;%取第一点
py2 = 1;
linepara = [1 1];
valid = false;
end
indx = count3;
end
%%%----------------------过滤,取出条形码边界上的点--------------------%%%
%diff = count1 - count2;
%if(diff > 0)
%py = [py1 py2 count1];%中心点的设置,把组成斜率的点数带出去,以作比较;
keyY =[py1_ave py2_ave valid indx];
%slope = [pslope nslope];
%linepara = [pline nline];
%linepara
%else
%ny = [ny1 ny2 count2];%中心点的设置
% keyY = [ny1 ny2 count2];%中心点的设置
% slope = [nslope pslope];
% linepara = [nline pline];
%end
%slope = [pslope nslope];%斜率
%linepara = [pline nline];%斜率为正和为负的直线;
%slope,py,ny,linepara]