5

Angenommen, ich habe gute Übereinstimmungen zwischen zwei Bildern und versuche, die Kamerabewegung zwischen ihnen wiederherzustellen. kann ich OpenCV 3 der neuen Anlagen für diese wie folgt verwenden:Kamera Pose Schätzung: Wie interpretiere ich Rotations-und Translationsmatrizen?

Mat E = findEssentialMat(imgpts1, imgpts2, focal, principalPoint, RANSAC, 0.999, 1, mask); 

int inliers = recoverPose(E, imgpts1, imgpts2, R, t, focal, principalPoint, mask); 

Mat mtxR, mtxQ; 
Mat Qx, Qy, Qz; 
Vec3d angles = RQDecomp3x3(R, mtxR, mtxQ, Qx, Qy, Qz); 

cout << "Translation: " << t.t() << endl; 
cout << "Euler angles [x y z] in degrees: " << angles.t() << endl; 

Nun, ich habe Probleme Einwickeln meinen Kopf herum, was R und t eigentlich bedeuten. Sind sie die Transformation, die benötigt wird, um Koordinaten von Kameraraum 1 zu Kameraraum zwei abzubilden, wie in p_2 = R * p_1 + t?

dieses Beispiel Betrachten wir mit Ground-Truth manuell beschriftet Korrespondenzen

enter image description here

Der Ausgang I bekommen, ist dies:

Translation: [-0.9661243151855488, -0.04921320381132761, 0.253341406362796] 
Euler angles [x y z] in degrees: [9.780449804801876, 46.49315494782735, 15.66510133665445] 

Ich versuche, dies zu passen, was ich in dem Bild sehen, und kommen mit der Interpretation, dass [-0.96,-0.04,0.25] sagt mir, ich habe nach rechts bewegt, wie die Koordinaten entlang der negativen x-Achse bewegt haben, aber es würde mir auch sagen, ich habe mich weiter weg bewegt, wie die Koordinaten mo entlang der positiven z-Achse.

Ich habe auch die Kamera um die y-Achse gedreht (nach links, was ich denke, wäre eine Drehung gegen den Uhrzeigersinn um die negative y-Achse, weil in OpenCV, die y-Achse nach unten zeigt, nicht ?)

Frage: Ist meine Interpretation korrekt und wenn nein, was ist die richtige?

Antwort

2

Es stellt sich heraus, meine Interpretation ist richtig, die Beziehung p2 = R * p1 + t hält tatsächlich. Man kann dies verifizieren, indem man cv::triangulatePoints() und cv::convertPointsFromHomogeneous verwendet, um 3D-Koordinaten von entsprechenden Punkten (relativ zu Kamera 1) zu erhalten und dann die obige Gleichung anzuwenden. Multiplikation mit der Kameramatrix der Kamera 2 ergibt dann die p2 Bildkoordinaten.

1

Ihre Interpretation klingt richtig zu mir. Ich bin nicht 100% über die Ausrichtung der Achse in OpenCV, aber ich glaube, dass Sie bezüglich der Y-Achse richtig sind.

Die Ausgabe ist auch sinnvoll, nicht nur aus einer Code-Perspektive, aber wenn Sie die zwei Bilder betrachten, können Sie sich grob vorstellen, wo eine volle 90-Grad-Drehung zeigen würde (es wäre im Wesentlichen der gleiche Winkel, aber im Gegenteil zu Seite des Autos)

Dies ist eine ziemlich anständige Erklärung des Konzepts über Starrkörperbewegung Mechanik: http://nghiaho.com/?page_id=671

0

Mal sehen. Der OpenCV Kamerakoordinatenrahmen ist "X in Richtung Bild rechts, Y in Richtung Bild unten, Z = X x Y in Richtung Szene". Q = [R | t] ist die Koordinatentransformation von camera2 zu camera1, so dass t der Vektor ist, der in camera1 wurzelt, mit der Spitze in camera2, ausgedrückt in camera1 frame. Daher bedeutet Ihr Übersetzungsvektor, dass sich Kamera2 links von Kamera 1 befindet, was bei Ihren Bildern nur möglich ist, wenn sich die Seitenansicht des Fahrzeugs in Kamera2 und die Vorderansicht des Autos in Kamera 1 befindet. Dies entspricht einer positiven Z-Komponente der Übersetzung, da in der Seitenansicht das Auto weiter weg von der Kamera erscheint.

Diese Identifikation stimmt auch mit den von Ihnen berechneten Euler-Winkeln überein: Sie werden in der OpenGL-Konvention zurückgegeben und geben somit die Rotation von der Quelle zum Ziel an. In Ihrem Fall, eine Drehung von 46 Grad um die vertikale Achse der Kamera1, gegen den Uhrzeigersinn w.r.t. die nach unten gerichtete Y-Achse, bringt Sie gerade in die Seitenansicht, die Sie haben.

+0

Aber die positive z-Komponente würde mir sagen, dass camera2 auf das Auto bezogen hat, aber das stimmt nicht mit der Interpretation überein, dass camera2 das linke Bild ist. Was vermisse ich? – oarfish

+0

Lies noch einmal, was ich geschrieben habe: "t ist der Vektor, der bei camera1 verwurzelt ist, mit der Spitze an Kamera2". Eine positive Z-Komponente von t bedeutet nur, dass sich das Zentrum der Kamera 2 vor der XY-Ebene der Kamera1 befindet, d. H. Vor der Mitte der Kamera1. Das ist bei Ihren Bildern durchaus plausibel: Stellen Sie sich vor, Sie erweitern die Bildebene in der Sicht auf die Front des Fahrzeugs und entscheiden dann, auf welcher Seite dieser Ebene die Kamera der Seitenansicht sein soll. Auch, bitte upvote/akzeptieren Sie die Antwort, wenn Sie es nützlich finden. –

+0

Wenn ich das tue, scheint es mir, dass das Zentrum der Kamera 2 * hinter * der Kamera 1 ist, also sollte z negativ sein. Aber es ist nicht sehr klar wegen der Rotation. – oarfish

1

Eigentlich ist Ihre Interpretation korrekt.

Zunächst einmal sind Sie richtig, über die Ausrichtung der y-Achse.Eine Illustration des Kamerakoordinatensystems von OpenCV finden Sie unter here.

Ihr Code gibt das R und t von der zweiten zur ersten Kamera zurück. Wenn x1 ein Punkt im ersten Bild und x2 ein Punkt im zweiten Bild ist, gilt die folgende Gleichung: x1 = R*x2 + t. Jetzt ist in Ihrem Fall das rechte Bild (Vorderansicht) von der Kamera 1 und das linke Bild (Seitenansicht) des Autos von der Kamera 2.

Betrachten wir diese Gleichung, sehen wir, dass zuerst die Rotation angewendet wird . So stellen Sie Ihre Kamera derzeit den linken Rahmen ab. Jetzt gibt Ihr R eine Drehung von etwa 46 Grad um die y-Achse an. Als Rotationspunkte um den Winkel Alpha ist das Gleiche wie die Gegenachse der Koordinatenachse um diesen Winkel, Ihr R sagt Ihnen, nach links zu drehen. Wie Sie selbst betonen, scheint dies korrekt zu sein, wenn man sich die Bilder anschaut. Da die Rotationen um die anderen Achsen klein und schwer darzustellen sind, lassen Sie sie hier weg. Nach dem Anwenden der Drehung stehen Sie immer noch an der gleichen Position, an der der linke Rahmen aufgenommen wurde, aber Ihre Kamera zeigt mehr oder weniger auf die Rückseite des Autos oder den Raum direkt hinter dem Auto.

Betrachten wir nun den Übersetzungsvektor. Ihre Interpretation, sich nach rechts und weiter weg zu bewegen, ist ebenfalls korrekt. Lass mich versuchen zu erklären, warum. Stellen Sie sich aus Ihrer aktuellen Position vor, mit der neuen Kamerarichtung bewegen Sie sich nur noch nach rechts. Sie würden direkt ins Auto stoßen oder müssen die Kamera über der Motorhaube halten. Wenn Sie sich also nach rechts bewegen, müssen Sie sich auch weiter entfernen, um die Position zu erreichen, von der Sie das rechte Bild aufgenommen haben.

Ich hoffe, diese Erklärung hat dir geholfen, dir die Bewegung vorzustellen, die dein R und t beschreibt.