49 lines
2 KiB
Mathematica
49 lines
2 KiB
Mathematica
|
% Estimation d'une matrice d'homographie H qui permet de passer d'une
|
||
|
% image I1 a une autre image I2 a partir de paires de points (homologues)
|
||
|
%
|
||
|
% H = [ h11 h12 h13 ; h21 h22 h23 ; h31 h32 h33 ]
|
||
|
% H possede 8 parametres independants.
|
||
|
% Chaque correspondance donne 2 equations.
|
||
|
% Ainsi pour estimer H, il faut au moins 4 paires de points.
|
||
|
%
|
||
|
% Il existe differentes manieres d'estimer H.
|
||
|
% Nous choisissons la resolution sous la contrainte ||h33|| = 1,
|
||
|
% au sens des moindres carres.
|
||
|
|
||
|
function [H] = homographie(XY_C1, XY_C2)
|
||
|
% Entrees :
|
||
|
%
|
||
|
% XY_C1 : matrice (NbPointsx2) contenant les coordonnees des Nbpoints dans l'image I1
|
||
|
% XY_C2 : matrice (NbPointsx2) contenant les coordonnees des Nbpoints HOMOLOGUES dans l'image I2
|
||
|
% (colonne 1 : les x, colonne 2 : les y)
|
||
|
%
|
||
|
% Sortie :
|
||
|
% H : la matrice d'homographie estimee
|
||
|
|
||
|
% Les parametres hij de la matrice d'homographie H sont ranges dans
|
||
|
% un vecteur : H = [ h11 ... h33 ]' tel que
|
||
|
% A * H = 0
|
||
|
% avec A qui depend des coordonnees de paires homologues, cf. equation (2)
|
||
|
% A = ( XY_C1(1,1) XY_C1(1,2) 1 0 0 0 -XY_C1(1,1)*XY_C2(1,1) -XY_C1(1,2)*XY_C2(1,1) -XY_C2(1,1)
|
||
|
% 0 0 0 XY_C1(1,1) XY_C1(1,2) 1 -XY_C1(1,1)*XY_C2(1,2) -XY_C1(1,2)*XY_C2(1,2) -XY_C2(1,2)
|
||
|
% ... etc ... )
|
||
|
|
||
|
% Stocker dans une variable le nombre de points apparies
|
||
|
N = size(XY_C1, 1);
|
||
|
|
||
|
% Construction des matrices/vecteurs utiles pour construire la matrice A
|
||
|
A = [
|
||
|
XY_C1(:, 1:2), ones(N, 1), zeros(N, 3), -XY_C2(:, 1) .* XY_C1(:, 1), -XY_C2(:, 1) .* XY_C1(:, 2), -XY_C2(:, 1);
|
||
|
zeros(N, 3), XY_C1(:, 1:2), ones(N, 1), -XY_C2(:, 2) .* XY_C1(:, 1), -XY_C2(:, 2) .* XY_C1(:, 2), -XY_C2(:, 2)
|
||
|
];
|
||
|
|
||
|
% Estimation des parametres de H par decomposition en valeurs singulieres
|
||
|
% Utiliser la fonction matlab svd :
|
||
|
% H est le vecteur propre associee a la plus petite valeur propre de A^TA
|
||
|
[~, ~, V] = svd(A' * A);
|
||
|
H = V(:, end);
|
||
|
|
||
|
% Former la matrice H de taille 3x3
|
||
|
H = reshape(H, 3, 3)';
|
||
|
|
||
|
end
|