gusucode.com > 基于matlab软件,实现双目视觉原理的摄像机标定,能根据各视场图像求内、外部参数 > 基于matlab软件,实现双目视觉原理的摄像机标定,能根据各视场图像求内、外部参数/TOOLBOX_calib/count_squares.m

    function ns = count_squares(I,x1,y1,x2,y2,win);

%keyboard;

[ny,nx] = size(I);

lambda = [y1 - y2;x2 - x1;x1*y2 - x2*y1];

lambda = 1/sqrt(lambda(1)^2 + lambda(2)^2) * lambda;

l1 = lambda + [0;0;win];
l2 = lambda - [0;0;win];


dx = x2-x1;
dy = y2 - y1;


if abs(dx) > abs(dy),
   
   if x2 > x1,
      xs = x1:x2;
   else
      xs = x1:-1:x2;
   end;
   
   ys = -(lambda(3) + lambda(1)*xs)/lambda(2);
   
else
   
   if y2 > y1,
      ys = y1:y2;
   else
      ys = y1:-1:y2;
   end;
   xs = -(lambda(3) + lambda(2)*ys)/lambda(1);
   
end;


   
	Np = length(xs);

	xs_mat = ones(2*win + 1,1)*xs;
	ys_mat = ones(2*win + 1,1)*ys;

	win_mat = (-win:win)'*ones(1,Np);


	xs_mat2 = round(xs_mat - win_mat * lambda(1));
	ys_mat2 = round(ys_mat - win_mat * lambda(2));

	ind_mat = (xs_mat2 - 1) * ny + ys_mat2;

	ima_patch = zeros(2*win + 1,Np);

	ima_patch(:) = I(ind_mat(:));

	%ima2 = ima_patch(:,win+1:end-win);

	filtk = [ones(win,Np);zeros(1,Np);-ones(win,Np)];

	out_f = sum(filtk.*ima_patch);

	out_f_f = conv2(out_f,[1/4 1/2 1/4],'same');

	out_f_f = out_f_f(win+1:end-win);

	ns = length(find(((out_f_f(2:end)>=0)&(out_f_f(1:end-1)<0)) | ((out_f_f(2:end)<=0)&(out_f_f(1:end-1)>0))))+1;

   


return;