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()
benutzt, um die Homographiematrix zu berechnen.
homography = findHomography(feature1 , feature2 , CV_RANSAC); //feature1 and feature2 are matched keypoints
Meine Frage ist: Wie kann ich diese Matrix verwenden, um Skalierung, Rotation und Translation zu berechnen? Kann jemand mir den Code oder die Erklärung zur Verfügung stellen, wie man es macht?
Nehmen wir an, dass die erste und die zweite Zelle der dritten Zeile 0 sind.
Die dritte Spalte der Matrix enthält die Übersetzung in X, die Übersetzung in Y bzw. 1.
Wie für den verbleibenden oberen linken 2x2-Teil der Homographiematrix (der Scherung, Skalierung und Rotation enthält), kann er nach verschiedenen Methoden zerlegt werden. Eine einfache und schnelle wird hier erklärt (diese Methode setzt invertible Matrix voraus): Ссылка
Um eine dreidimensionale Transformation und Rotation durch eine Homographie zu schätzen, gibt es mehrere Ansätze. Eine von ihnen 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 Dekomposition bereits ( discomposeHomographyMat ). Bei gegebener Homographie und korrekt skalierter intrinsischer Matrix bietet die Funktion einen Satz von vier möglichen Rotationen und Translationen.
Die richtige Antwort ist die Verwendung der Homographie, wie sie dst = H definiert ist. src und erkunden, was es zu kleinen Segmenten um einen bestimmten Punkt macht. Zur Übersetzung einfach einen Punkt auswählen: Übersetzung = dst-H .src Für die Rotation zwei Punkte p1 und p2 untersuchen. p1 '= H. p1, p2 '= H. p2. Berechnen Sie nun einfach den Winkel zwischen den Vektoren p1 p2 und p1'p2 '. Für den Maßstab können Sie den gleichen Trick verwenden, aber vergleichen Sie jetzt 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.
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 Vorstellung davon, wie eine affine Transformation in verschiedene Parameter zerlegt werden kann.
Tags und Links c++ opencv video matrix homography