No products are associated with this question.
You don't say what you are starting from. If you have a set of matched input and output points, one possible method is given here. A simple implementation is below.
function v = homography_solve(pin, pout) % HOMOGRAPHY_SOLVE finds a homography from point pairs % V = HOMOGRAPHY_SOLVE(PIN, POUT) takes a 2xN matrix of input vectors and % a 2xN matrix of output vectors, and returns the homogeneous % transformation matrix that maps the inputs to the outputs, to some % approximation if there is noise. % % This uses the SVD method of % http://www.robots.ox.ac.uk/%7Evgg/presentations/bmvc97/criminispaper/node3.html
% David Young, University of Sussex, February 2008
if ~isequal(size(pin), size(pout)) error('Points matrices different sizes'); end if size(pin, 1) ~= 2 error('Points matrices must have two rows'); end n = size(pin, 2); if n < 4 error('Need at least 4 matching points'); end
% Solve equations using SVD x = pout(1, :); y = pout(2,:); X = pin(1,:); Y = pin(2,:); rows0 = zeros(3, n); rowsXY = -[X; Y; ones(1,n)]; hx = [rowsXY; rows0; x.*X; x.*Y; x]; hy = [rows0; rowsXY; y.*X; y.*Y; y]; h = [hx hy]; if n == 4 [U, ~, ~] = svd(h); else [U, ~, ~] = svd(h, 'econ'); end v = (reshape(U(:,9), 3, 3)).'; end
If your initial data is in some other form, such as camera position parameters relative to the plane, please say.
EDIT - added:
To apply the resulting matrix to a set of points, you can use the following function.
function y = homography_transform(x, v) % HOMOGRAPHY_TRANSFORM applies homographic transform to vectors % Y = HOMOGRAPHY_TRANSFORM(X, V) takes a 2xN matrix, each column of which % gives the position of a point in a plane. It returns a 2xN matrix whose % columns are the input vectors transformed according to the homography % V, represented as a 3x3 homogeneous matrix.
q = v * [x; ones(1, size(x,2))]; p = q(3,:); y = [q(1,:)./p; q(2,:)./p]; end
Play games and win prizes!Learn more