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;