logo资料库

二维码三点定位代码.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
clear all; QR_image=imread(' '); Es=40; Ec=10; [m n]=size(QR_image); result_max=max(m,n); search_error=Es; com_error=Ec; h_result=zeros(2,result_max); h_pointer=1; v_result=zeros(2,result_max); v_pointer=1; state=0; success=0; point_type=QR_image(1,1); length_counter=1; length_last=0; length_standard=0; point_start=0; point_end=0; disp('水平扫描开始...') %水平搜索主循环 for i=1:m for j=1:n %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% switch state; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 0 if point_type == QR_image(i,j) length_counter=length_counter+1; elseif point_type ~= QR_image(i,j) point_type = QR_image(i,j); if abs(length_counter-length_last)/length_counter < search_error/100 state=1; length_standard=(length_counter+length_last)/2; point_start=j; end length_last=length_counter; length_counter=1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case 1 if point_type == QR_image(i,j) length_counter=length_counter+1; elseif point_type ~= QR_image(i,j) point_type = QR_image(i,j); if abs(length_counter-3*length_standard) / length_standard < search_error/100 state=2; point_end=j; elseif abs(length_counter-length_standard) / length_standard < search_error/100 length_standard=(length_counter+length_last) / 2; length_last=length_counter; point_start=j; elseif 0<1 length_last=length_counter; state=0; end length_counter=1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 2 if point_type == QR_image(i,j) length_counter=length_counter+1; elseif point_type ~= QR_image(i,j) point_type = QR_image(i,j); if abs(length_counter-length_standard)/length_standard < search_error/100 state=3; else length_last=length_counter; state=0; end length_counter=1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 3 if point_type == QR_image(i,j) length_counter=length_counter+1; elseif point_type ~= QR_image(i,j) point_type = QR_image(i,j); if abs(length_counter-length_standard)/length_standard < search_error/100 res=(point_start+point_end)/2; h_result(:,h_pointer)=[res i]'; h_pointer=h_pointer+1;
else length_last=length_counter; end length_counter=1; state=1; point_start=j; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end state=0; length_counter=1; end %搜索状态值 %搜索成功 %垂直数据初始化 clear i j; state=0; success=0; point_type=QR_image(1,1); %计数点的类型 length_counter=1; %当前长度计数 length_last=0; %上一次计数长度 length_standard=0; %使用的标准长度 point_start=0; point_end=0; %记录起始位置 %记录终结位置 disp('垂直扫描开始...') %垂直搜索主循环 for i=1:n for j=1:m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% switch state; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 0 if point_type == QR_image(j,i) length_counter=length_counter+1; elseif point_type ~= QR_image(j,i) point_type = QR_image(j,i); if abs(length_counter-length_last)/length_counter < search_error/100 state=1;
length_standard=(length_counter+length_last)/2; point_start=j; end length_last=length_counter; length_counter=1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 1 if point_type == QR_image(j,i) length_counter=length_counter+1; elseif point_type ~= QR_image(j,i) point_type = QR_image(j,i); if abs(length_counter-3*length_standard)/ length_last < search_error/100 state=2; point_end=j; elseif abs(length_counter-length_standard) / length_standard < search_error/100 length_standard=(length_counter+length_last)/2; length_last=length_counter; point_start=j; elseif 0<1 length_last=length_counter; state=0; end length_counter=1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 2 if point_type == QR_image(j,i) length_counter=length_counter+1; elseif point_type ~= QR_image(j,i) point_type = QR_image(j,i); if abs(length_counter-length_standard)/length_standard < search_error/100 state=3; else length_last=length_counter; state=0; end length_counter=1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 3
if point_type == QR_image(j,i) length_counter=length_counter+1; elseif point_type ~= QR_image(j,i) point_type = QR_image(j,i); if abs(length_counter-length_standard)/length_standard < search_error/100 res=(point_start+point_end)/2; v_result(:,v_pointer)=[i res]'; v_pointer=v_pointer+1; else length_last=length_counter; end length_counter=1; state=1; point_start=j; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end state=0; length_counter=1; end %粗定位,找到定位图形附近坐标集合 clear i j; clear s t l; final_data=zeros(2,1); final_counter=1; [l s]=size(h_result); [l t]=size(v_result); for i=1:s if h_result(1,i) == 0 break; end for j=1:t if v_result(1,j) == 0 break; end a=h_result(1,i); b=h_result(2,i); if abs(h_result(1,i) - v_result(1,j)) <= com_error && abs(h_result(2,i) - v_result(2,j)) <= com_error
final_data(1,final_counter)=h_result(1,i); final_data(2,final_counter)=h_result(2,i); final_counter=final_counter+1; end end end %精定位,确定一个最终坐标值 a_data=zeros(2,20); a_counter=1; b_data=zeros(2,20); b_counter=1; c_data=zeros(2,20); c_counter=1; d_data=zeros(2,20); d_counter=1; e_data=zeros(2,20); e_counter=1; f_data=zeros(2,20); f_counter=1; clear i; for i=1:final_counter-1 if ( abs(a_data(1,a_counter)-final_data(1,i)) <10 && abs(a_data(2,a_counter)-final_data(2,i)) <10 ) || a_counter == 1 a_data(:,a_counter)=final_data(:,i); a_data(:,a_counter+1)=final_data(:,i); a_counter=a_counter+1; abs(b_data(2,b_counter)-final_data(2,i)) <10 ) || b_counter == 1 elseif ( abs(b_data(1,b_counter)-final_data(1,i)) <10 && b_data(:,b_counter)=final_data(:,i); b_data(:,b_counter+1)=final_data(:,i); b_counter=b_counter+1; abs(c_data(2,c_counter)-final_data(2,i)) <10 ) || c_counter == 1 elseif ( abs(c_data(1,c_counter)-final_data(1,i)) <10 && c_data(:,c_counter)=final_data(:,i); c_data(:,c_counter+1)=final_data(:,i); c_counter=c_counter+1; abs(d_data(2,d_counter)-final_data(2,i)) <10 ) || d_counter == 1 elseif ( abs(d_data(1,d_counter)-final_data(1,i)) <10 && d_data(:,d_counter)=final_data(:,i); d_data(:,d_counter+1)=final_data(:,i); d_counter=d_counter+1; elseif ( abs(e_data(1,e_counter)-final_data(1,i)) <10 && abs(e_data(2,e_counter)-final_data(2,i)) <10 ) || e_counter == 1 e_data(:,e_counter)=final_data(:,i);
e_data(:,e_counter+1)=final_data(:,i); e_counter=e_counter+1; abs(f_data(2,f_counter)-final_data(2,i)) <10 ) || f_counter == 1 elseif ( abs(f_data(1,f_counter)-final_data(1,i)) <10 && f_data(:,f_counter)=final_data(:,i); f_data(:,f_counter+1)=final_data(:,i); f_counter=f_counter+1; end end counter_array=[a_counter b_counter c_counter d_counter e_counter f_counter]; counter_sort=sort(counter_array); threshold=counter_sort(4); a_data(:,a_counter)=[0 0]'; b_data(:,b_counter)=[0 0]'; c_data(:,c_counter)=[0 0]'; d_data(:,d_counter)=[0 0]'; e_data(:,e_counter)=[0 0]'; f_data(:,f_counter)=[0 0]'; x=zeros(2,3); clear i; i=1; if a_counter>=threshold x(1,i)=sum(a_data(1,:))/(a_counter-1); x(2,i)=sum(a_data(2,:))/(a_counter-1); i=i+1; end if b_counter>=threshold x(1,i)=sum(b_data(1,:))/(b_counter-1); x(2,i)=sum(b_data(2,:))/(b_counter-1); i=i+1; end if c_counter>=threshold x(1,i)=sum(c_data(1,:))/(c_counter-1); x(2,i)=sum(c_data(2,:))/(c_counter-1); i=i+1; end if d_counter>=threshold x(1,i)=sum(d_data(1,:))/(d_counter-1); x(2,i)=sum(d_data(2,:))/(d_counter-1); i=i+1; end if e_counter>=threshold x(1,i)=sum(e_data(1,:))/(e_counter-1); x(2,i)=sum(e_data(2,:))/(e_counter-1);
i=i+1; end if f_counter>=threshold x(1,i)=sum(f_data(1,:))/(f_counter-1); x(2,i)=sum(f_data(2,:))/(f_counter-1); i=i+1; end %绘图 ax = x(1,1); ay = x(2,1); bx = x(1,2); by = x(2,2); cx = x(1,3); cy = x(2,3); dx=bx+cx-ax; dy=by+cy-ay; imshow(QR_image) hold on %右上角点 plot(x(1,1),x(2,1),'g+') %左上角点 plot(x(1,2),x(2,2),'r+') plot(x(1,3),x(2,3),'w+') %左下角点 plot(dx ,dy, 'r+') %右下角点 hold off L1= sqrt( (ax -bx)^2+ (ay - ay)^2 );% AD 距离 L2= sqrt( (bx -cx)^2+ (by -cy)^2 );% AD 距离 QR_image=imcomplement(QR_image); thea1=atan((ay-by)/(ax-bx)); thea2=(180* thea1)/pi; %B=imrotate(QR_image, thea,’bilinear’,’crop’); B=imrotate(QR_image, thea2,'bilinear'); imshow(B);
分享到:
收藏