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