MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today**New to MATLAB?**

Asked by Tejas Kulkarni
on 15 Jan 2012

Can somebody please help me in understanding how to calculate an homography matrix in matlab.

*No products are associated with this question.*

Answer by David Young
on 15 Jan 2012

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

Show 3 older comments

Jason Rebello
on 23 Sep 2012

Hi, First of all thanks for the code it really helped. But can you explain to me why exactly are u reshaping only the last column. Im new to matlab so I dont really pick up on things fast. v = (reshape(U(:,9), 3, 3)).'; ?? Thanks, Jason

Erez Farhan
on 14 Jun 2013

Hi,
David- thanks for your post.
Please note: I believe your solution doesn't account for **normalization of the homography matrix**- which can be done by dividing it by it's second singular value.

## 1 Comment

## Lalit Patil (view profile)

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/26141#comment_124169

I am finding homography matrix in another way and it is 3*3

So, i want to know that in image where to apply or what to do of this homography matrix.?

Why we are finding this matrix..?