关于张正友棋盘标定法的问题,如何确定世界坐标?单应性矩阵怎么建立?
读过张正友算法的论文,大概明白该算法标定的思想,但在实现过程中遇到一些问题。
1、需要在不同角度拍摄图片
算法需要的数据是一些棋盘格子的世界坐标和对应的像素坐标。那么世界坐标如何确定?
按照张正友教授文章中所说,通过移动棋盘或者相机,拍摄一些图片。
那么移动棋盘或相机,都会造成世界坐标系的改变,那么用这些标定的结果反求世界坐标,会求出不同的世界坐标。
还是说,不以棋盘为绝对世界坐标,按照摄像机视野规定一个绝对世界坐标,然后确定棋盘在这个坐标系中的坐标,那么此时棋盘无论如何移动都在绝对世界坐标系下,就可以了?但是如果通过移动摄像机获得多张图像,那么每次都会改变世界坐标系,此时得到的方程解出的数据应该会有问题吧?感觉很困惑。
2、如何建立单应性矩阵?
在阅读Matlab算法程序过程中,对于建立单应性矩阵的函数没有看懂。
function H = homography2d(varargin)
[x1, x2] = checkargs(varargin(:));% varargin"变长度输入宗量列表"varargin本身是个元胞数组
M=x1; % varargout"变长度输出宗量列表"
m=x2;
% Attempt to normalise( 规格化)each set of points so that the origin
% is at centroid (质心)and mean distance from origin is sqrt(2).(因为是正方形)
[x1, T1] = normalise2dpts(x1);
[x2, T2] = normalise2dpts(x2);
% Note that it may have not been possible to normalise
% the points if one was at infinity so the following does not
% assume that scale parameter w = 1.
% Estimation of the H between the model plane and its image, P18建立单应性矩阵
Npts = length(x1);
A = zeros(3*Npts,9);%A为超定方程
O = [0 0 0];
for n = 1:Npts
X = x1(:,n)';%定义
x = x2(1,n);y = x2(2,n); w = x2(3,n);
A(3*n-2,:) = [ O -w*X y*X];
A(3*n-1,:) = [ w*X O -x*X];
A(3*n ,:) = [-y*X x*X O ];
end
[U,D,V] = svd(A);
% Ax=b x=A\b;
% Extract homography单应性矩阵
H1 = reshape(V(:,9),3,3)'
% Denormalize反向规格化,
H2= T2\H1*T1;
H=H2/H2(3,3);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Maximun likelihood estimation for the H最大似然估计
% using the function(10), P7
options = optimset('LargeScale','off','LevenbergMarquardt','on');
[x,resnorm,residual,exitflag,output] = lsqnonlin( @simon_H, reshape(H,1,9) , [],[],options,m, M);
H=reshape(x,3,3);
H=H/H(3,3);
Row = size(M,2);
Temp = zeros(Row*2,8);
Temp(1:Row,1) = M(1,:);
Temp(1:Row,2) = M(2,:);
Temp(1:Row,3) = M(3,:);
Temp(Row+1:Row*2,4) = M(1,:);
Temp(Row+1:Row*2,5) = M(2,:);
Temp(Row+1:Row*2,6) = M(3,:);
Goal = zeros(Row,1);
for i=1:Row
Temp(i,7) = -m(1,i,1)*M(1,i);
Temp(i,8) = -m(1,i,1)*M(2,i);
Temp(Row+i,7) = -m(2,i,1)*M(1,i);
Temp(Row+i,8) = -m(2,i,1)*M(2,i);
Goal(i) = -m(1,i,1)*M(3,i);
Goal(Row+i) = -m(2,i,1)*M(3,i);
end
HH = [];HH = inv(Temp'*Temp)*Temp'*Goal;
kk = [];kk = Temp*HH-Goal;sumkk = kk'*kk;
HH1 = [];HH1 = [H(1,:),H(2,:),H(3,:)]';
kk1 = [];kk1 = -Temp*HH1(1:8) - Goal;sumkk1 = kk1'*kk1;
[sumkk sumkk1]