2014-09-04 6 views
8

Ich versuche, Skalierung, Rotation und Translation zwischen zwei aufeinanderfolgenden Frames eines Videos zu berechnen. Also habe ich im Prinzip Schlüsselpunkte abgeglichen und dann die opencv-Funktion findHomography() verwendet, um die Homographiematrix zu berechnen.
homography = findHomography(feature1 , feature2 , CV_RANSAC); //feature1 and feature2 are matched keypointsBerechnen von Skalierung, Rotation und Translation aus der Homographiematrix

Meine Frage ist: Wie kann ich diese Matrix verwenden, um Skalierung, Rotation und Translation zu berechnen ?.
Kann mir jemand den Code oder die Erklärung geben, wie es geht?

+1

Das Schlüsselwort ist "Homographie-Zerlegung". Afair können Sie die Rotation mit einer QR-Dekomposition extrahieren, aber Sie sollten besser googeln, dass ... – Micka

+1

vielleicht dieser (oder seine Links) helfen wird: http://StackOverflow.com/Questions/15420693/how-to-get- Rotation-Translation-Scherung-von-a-3x3-Homographie-Matrix-in-c-sharp – Micka

+1

und diese = http://hal.archives-ouvertes.fr/docs/00/17/47/39/PDF /RR-6303.pdf – Micka

Antwort

0

zum Schätzen eines Baum-dimensionalen Transformation und Rotation induziert durch eine Homografie, gibt es mehrere Ansätze nutzen können. One of them bietet geschlossene Formeln zum Zerlegen der Homographie, aber sie sind sehr komplex. Außerdem sind die Lösungen niemals einzigartig.

Glücklicherweise implementiert OpenCV 3 diese Zerlegung bereits (decomposeHomographyMat). Bei gegebener Homographie und korrekt skalierter intrinsischer Matrix bietet die Funktion einen Satz von vier möglichen Rotationen und Translationen.

1

annehmen lassen, dass die ersten und zweiten Zellen der dritten Zeile 0.

Die dritte Spalte der Matrix enthält Translation in X, Y-Übersetzung in bzw. 1 sind.

Für den verbleibenden oberen linken 2x2-Teil der Homographiematrix (der Scherung, Skalierung und Rotation enthält) kann er nach verschiedenen Methoden zerlegt werden. Hier wird eine einfache und schnelle erklärt (diese Methode geht von einer invertierbaren Matrix aus): https://math.stackexchange.com/questions/78137/decomposition-of-a-nonsquare-affine-matrix

+0

Die Übersetzung in 3D kann nicht vollständig wiederhergestellt werden. – Vlad

0

Die richtige Antwort ist, Homographie so zu verwenden, wie es dst = H definiert ist. src und erkunden, was es zu kleinen Segmenten um einen bestimmten Punkt macht. Für die Übersetzung wählen Sie einfach einen einzigen Punkt: Translation = dst-H .src Für die Rotation erkunden Sie zwei Punkte p1 und p2. p1 '= H. p1, p2 '= H. p2. Berechnen Sie nun einfach den Winkel zwischen den Vektoren p1 p2 und p1'p2 '. Für Maßstab können Sie den gleichen Trick verwenden, aber jetzt vergleichen Sie einfach die Länge von | p1 p2 | und | p1'p2 '|. Verwenden Sie ein anderes Segment orthogonal zum ersten und mitteln Sie das Ergebnis. Sie werden sehen, dass es keinen konstanten Skalierungsfaktor oder eine Übersetzung gibt. Sie hängen vom Standort der Quelle ab.

0

Die Frage scheint über 2D-Parameter zu sein. Homography Matrix erfasst perspektivische Verzerrung. Wenn die Anwendung nicht viel perspektivische Verzerrung erzeugt, kann man eine reale Transformation mit einer affinen Transformationsmatrix approximieren (die nur Skalierung, Rotation, Translation und kein Scheren/Spiegeln verwendet). Der folgende Link gibt eine Idee über das Zerlegen einer affinen Transformation in verschiedene Parameter.

https://math.stackexchange.com/questions/612006/decomposing-an-affine-transformation

Verwandte Themen