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

1 件のコメント

Lalit Patil
Lalit Patil 2013 年 1 月 22 日
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..?

サインインしてコメントする。

回答 (2 件)

David Young
David Young 2012 年 1 月 15 日

6 投票

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

13 件のコメント

Sean Lawson
Sean Lawson 2012 年 3 月 27 日
Hi
I have a question regarding the final transform matrix v.
I want to apply the homography(projective transform) in Matlab, I use this approach to calculate the matrix v. However, v(3,3) ~= 1, whereas Matlab requires v(3,3) = 1, do you know how to fix this? Or just v/v(3,3) works?
David Young
David Young 2012 年 3 月 30 日
Hi Sean, I'm adding a function to my answer with I hope deals with this question.
Royi Avital
Royi Avital 2012 年 7 月 30 日
What if you want to impose Affine Matrix (Last row to be [0, 0, 1])?
Jason Rebello
Jason Rebello 2012 年 9 月 23 日
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 2013 年 6 月 14 日
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
pankhuri 2013 年 6 月 19 日
can this be applied for 2D to 3D projection??
sushanth kalva
sushanth kalva 2016 年 5 月 9 日
i want to know the difference between transformation matrix and homography matrix
Tianya Zhang
Tianya Zhang 2017 年 11 月 28 日
編集済み: Tianya Zhang 2017 年 11 月 28 日
svd() function returns U, S and V. h can be obtained from the last colum of V. Why you use U to get h in your code? That's confusing.... Is that an obvious mistake?
Edwin Stanley
Edwin Stanley 2018 年 3 月 8 日
Also curious about Tianya's comment above!
"svd() function returns U, S and V. h can be obtained from the last colum of V. Why you use U to get h in your code? That's confusing.... Is that an obvious mistake?"
Albert Dayn
Albert Dayn 2019 年 2 月 13 日
In response to Tianya and Edwin's question, U is correct. It looks like in this function, h is constructed as the transpose of the usual matrix (each point is represented by 2 columns here, instead of 2 rows). If it were constructed as the link (for the SVD method) specifies, you would indeed use the last column of V.
PENIEL EMANUEL
PENIEL EMANUEL 2020 年 12 月 1 日
how to get target physical coordinates in millimetres
Wei Han
Wei Han 2022 年 3 月 25 日
編集済み: Wei Han 2022 年 3 月 25 日
Hi, I just want to thank for your code, it's really helped me!
Sahana Srivathsa
Sahana Srivathsa 2022 年 4 月 25 日
This is very helpful. I think equation for q needs to be slightly altered.
q = v * [x; y; ones(1, size(x,2))];

サインインしてコメントする。

Matt J
Matt J 2022 年 4 月 25 日
編集済み: Matt J 2022 年 4 月 25 日

0 投票

1 件のコメント

Matt J
Matt J 2022 年 4 月 26 日
編集済み: Matt J 2022 年 4 月 26 日
You shouldn't be extracting the matrix. You should be using tform.transformPointsForward().

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeSparse Matrices についてさらに検索

質問済み:

2012 年 1 月 15 日

編集済み:

2022 年 4 月 26 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by