Discover MakerZone

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

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

New to MATLAB?

Homography Matrix

Asked by Tejas Kulkarni

Tejas Kulkarni (view profile)

on 15 Jan 2012

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

1 Comment

Lalit Patil

Lalit Patil (view profile)

on 22 Jan 2013

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..?

Tejas Kulkarni

Tejas Kulkarni (view profile)


No products are associated with this question.

1 Answer

Answer by David Young

David Young (view profile)

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
% David Young, University of Sussex, February 2008
if ~isequal(size(pin), size(pout))
    error('Points matrices different sizes');
if size(pin, 1) ~= 2
    error('Points matrices must have two rows');
n = size(pin, 2);
if n < 4
    error('Need at least 4 matching points');
% 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);
    [U, ~, ~] = svd(h, 'econ');
v = (reshape(U(:,9), 3, 3)).';

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];


Jason Rebello

Jason Rebello (view profile)

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

Erez Farhan (view profile)

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.


pankhuri (view profile)

on 19 Jun 2013

can this be applied for 2D to 3D projection??

David Young

David Young (view profile)

Contact us