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]