4

Ich führe einen einfachen Test für OpenCV Kamera Pose Schätzung. Wenn ich ein Foto und das gleiche Foto hochskaliert (gezoomt) habe, benutze ich sie, um Merkmale zu erkennen, die essentielle Matrix zu berechnen und Kameraposen wiederherzustellen.Ist die Funktion recoverPose() in OpenCV linkshändig?

Mat inliers; 
Mat E = findEssentialMat(queryPoints, trainPoints, cameraMatrix1, cameraMatrix2, 
         FM_RANSAC, 0.9, MAX_PIXEL_OFFSET, inliers); 

size_t inliersCount = 
    recoverPose(E, queryGoodPoints, trainGoodPoints, cameraMatrix1, cameraMatrix2, R, T, inliers); 

Also, wenn ich das Originalbild als erste angeben, und das gezoomte Bild als die zweiten, bekomme ich Übersetzung T der Nähe von [0; 0; -1]. Die zweite Kamera (gezoomt) ist jedoch näher am Objekt als die erste. Wenn also die Z-Achse von der Bildebene in die Szene geht, sollte die zweite Kamera einen positiven Versatz entlang der Z-Achse haben. Für das Ergebnis, das ich bekomme, geht die Z-Achse von der Bildebene zur Kamera, die unter anderen Achsen (X geht nach rechts, Y nach unten) linkshändiges Koordinatensystem bildet. Ist das wahr? Warum unterscheidet sich dieses Ergebnis von dem dargestellten Koordinatensystem here?

Antwort

3

Nach dem OpenCV document basiert der Algorithmus in der Funktion recoverPose auf dem Papier "Nistér, D. Eine effiziente Lösung für das Fünf-Punkte-Pose Problem, CVPR 2003." Aus den Gleichungen in Abschnitt 2 in diesem Papier, wir wissen, dass es die grundlegende Dreiecksbeziehung verwendet (siehe Abbildung here):

x2 = R * x1 + t

Daher ist Übersetzung t der Vektor von cam2 cam1 in cam2 Rahmen. Dies erklärt, warum Sie die Antwort t nahe bei [0; 0; -1].

1

Scheint, dass die Funktion recoverPose() die erste Kameratransformation relativ zur zweiten zurückgibt (was für mich nicht intuitiv war und in der Dokumentation nicht klar angegeben ist). Mit dieser Annahme funktioniert der Test korrekt.