6
votes

Informer une matrice qui transforme un quadrilatère vers un autre quadrilatère en 2D

Dans la figure ci-dessous, il est de calculer la matrice d'homographie H qui transforme les points A1 A2 A3 A4 vers leurs homologues B1 B2 B3 B4. C'est:

px=[0 1 1 0];  % a square
py=[1 1 0 0];

qx=[18 18 80 80];    % a random quadrangle
qy=[-20 20 60 -60];
if (DEBUG)
  fill(px,py,'r');
  fill(qx,qy,'r');
end

Q=[qx;qy;ones(size(qx))];
P=[px;py;ones(size(px))];
H=Q/P;
H*P-Q
answer:
   -0.0000         0         0         0         0
  -20.0000   20.0000  -20.0000   20.0000    0.0000
   -0.0000         0         0         0   -0.0000


6 commentaires

Ce n'est pas ma région, mais je crois que le mieux que vous puissiez faire est une solution moindre carrés, car vous avez plus de contraintes dans votre équation que vous n'avez de paramètres gratuits.


C'est exactement à droite, SVD est la solution, mais je manque quelque chose quelque part dans mon code.


Qu'est-ce que tu essaies maintenant? Par analogie aux moindres carrés linéaires, ma première hypothèse serait h = b * a '* INV (a * a')


dans matlab simplement h = b / a où b = [B1 B2 B3 B4], A = [A1 A2 A3 A4]


Et vous pensez qu'il devrait exister une matrice qui fait mieux? Je ne suis pas sûr de ce que vous demandez ...


Référence croisée: voir Cet article sur Math SE pour une discussion mathématique sur la manière de trouver la transformation projective, sans outils spéciaux de Matlab.


5 Réponses :


1
votes

Vous pouvez utiliser le algorithme DLT à cet effet. Il y a des routines Matlab disponibles pour le faire dans page d'accueil de Peter Kovesi .


0 commentaires

2
votes

Vous pouvez essayer la fonction cp2tform , qui déduit la transformation spatiale des paires de points de contrôle. Étant donné que le parallèle n'est pas préservé dans votre cas, vous devez définir le transformtype pour être "projectif". Plus d'infos est ici


0 commentaires

0
votes

Combinez toutes les coordonnées dans Vecteurs de colonne forts>. Dans cas 2D, ils sont: AX code>, ay code>, bx code>, par code>;

Définir: P> >

input_new = [ones(size(A_new, 1), 1), A_new];
B_new = input_new * H;


2 commentaires

@Amro: Désolé de détourner ce fil, mais je voulais l'opinion d'Amro. Si vous regardez ma réponse, j'ai référencé ma solution à une question précédente. Je crois que ce n'est pas techniquement une duplication exacte mais peut-être la différence n'est pas pertinente. Qu'en penses-tu?


@Jacob: Absolument, c'est une bonne réponse. Peut-être que vous devriez poster du code ici adapté à ce problème. (BTW, il semble y avoir un lien mort pointant vers certaines diapositives). OMI, ces questions sont similaires mais pas des doublons exacts.



0
votes

J'ai discuté d'un problème connexe dans un Réponse à une autre question (inclut une solution MATLAB). Dans le problème lié, le quadrilatère de sortie était un rectangle, mais ma réponse gère le problème général.


1 commentaires

Merci Jacob, vous avez raison c'est exactement la même question. Je cherchais en fait une homographie.



1
votes

Utilisation des données que vous avez publiées: xxx pré>

calculer la transformation: p> xxx pré>

Appliquez la transformation: p>

%# maximum error
>> max(max( abs(Z(:,1:2)-B) ))
ans =
   8.5265e-14


2 commentaires

Ce n'est pas ce que je cherchais. Dans votre solution H est 4x4, ce qui signifie que si nous incorporons n points, H deviendra NXN. Nous recherchons une matrice 3x3 d'homographie.- Mais merci de toute façon


@Cgraphics: C'est vrai, merci de pointer cela. Peut-être que depuis seulement 4 points suffisent pour résoudre le système, cela ne devrait pas être un problème ... de toute façon, j'ai un exemple en utilisant CP2TForm Fonction comme Chaohuang suggérées. Il en déduire correctement la matrice d'homographie 3x3 de la transformation projective d'un minimum de 4 points de contrôle. Je posterai bientôt, peut-être que quelqu'un va le trouver utile