vgg_mrdivs.m
来自「实现了几何多视的功能」· M 代码 · 共 50 行
M
50 行
% vgg_mrdivs Solves equation system Y*diag(s) = A*X with unkowns A, s.
%
% A = vgg_mrdivs(X,Y) solves (overdetermined) equation system Y*diag(s) = A*X
% by linear method (DLT algorithm).
% Parameters:
% X ... double (N,K)
% Y ... double (M,K)
% A ... double (M,N)
% s ... double (1,K)
%
% Preconditioning of the points not included in the function. Use vgg_conditioner_*.
%
% Typical usage:
% 1. Estimating an image homography from K pairs of corresponding points.
% If 3-by-K matrices x and y are the points in homogeneous coordinates, the 3-by-3 homography
% matrix is obtained as H = vgg_mrdivs(x,y).
%
% 2. Estimating 3-by-4 camera projection matrix P from corresponding pairs of image and scene points.
% For image points x (3xK matrix) and scene points X (4xK matrix) do P = vgg_mrdivs(X,x).
% (c) werner@robots.ox.ac.uk
% Algorithm:
%
% For n-th point pair X(:,n) and Y(:,n) we have
% s*X(:,n) = A*Y(:,n)
% We eliminate s what results in MY*(MY-1)/2 linear homogenous equations
% for elements of A. We solve this system by svd or eig.
function A = vgg_mrdivs(X,Y)
[MX,N] = size(X);
[MY,NY] = size(Y);
if N ~= NY, error('Matrices A, B must have equal number of columns.'); end
% construct the measurement matrix
W = zeros(MX*MY,MY*(MY-1)/2*N);
k = 1;
for i = 1:MY
for j = 1:i-1
W([[1:MX]+MX*(j-1) [1:MX]+MX*(i-1)],[1:N]+N*(k-1)) = [(ones(MX,1)*Y(i,:)).*X; -(ones(MX,1)*Y(j,:)).*X];
k = k+1;
end
end
% solve the system || A'(:)' * W || ---> min
[dummy,s,A] = svd(W',0);
A = reshape(A(:,end),MX,MY)';
return
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?