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

# Homography Matrix

Asked by Tejas Kulkarni on 15 Jan 2012

## 1 Comment

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

## Products

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.

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
```

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.

pankhuri on 19 Jun 2013

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