Ich habe eine kalibrierte Kamera (intrinsische Matrix und Verzerrungskoeffizienten) und ich möchte die Kameraposition wissen, einige 3D-Punkte und ihre entsprechenden Punkte im Bild (2d Punkte).Kameraposition in Weltkoordinate von cv :: solvePnP
Ich weiß, dass cv::solvePnP
mir helfen könnte, und nach this und this Lesen verstehe ich, dass ich die Ausgänge der solvePnP rvec
und tvec
sind die Rotation und Translation des Objekts im Kamerakoordinatensystem.
Also muss ich die Kamera Rotation/Übersetzung im Weltkoordinatensystem herausfinden.
Von den Links oben scheint es, dass der Code einfach ist, in Python:
found,rvec,tvec = cv2.solvePnP(object_3d_points, object_2d_points, camera_matrix, dist_coefs)
rotM = cv2.Rodrigues(rvec)[0]
cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)
Ich weiß nicht, Python/numpy stopft (Ich verwende C++), aber das macht nicht viel Sinn für mich:
- rvec, TVEC Ausgabe von solvePnP sind 3x1 Matrix, 3 Elementvektoren
- cv2.Rodrigues (rvec) ist eine 3x3-Matrix
- cv2.Rodrigues (rvec) [0] ist ein 3x1 Matrix, 3 Elemente Vektoren
- cameraPosition ist eine 3x1 * 1x3 Matrix Multiplikation, die eine .. 3x3 Matrix ist. wie kann ich das in opengl mit einfachen
glTranslatef
undglRotate
aufrufen?
scheint zu arbeiten, bekomme ich die Winkel für 'glRotatef' mit einer Formel aus dieser: http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/index.htm und dann normale Konvertierung von Radiale zu Grad. Aber wenn ich diese Werte in opengl stecke bekomme ich immer noch eine falsche Kameradrehung (Rotation X ist etwa 45 ° falsch) und etwas falsche Übersetzung. – nkint
Das kann daran liegen, dass der Kamerarahmen in OpenCV und OpenGL anders ist . Überprüfen Sie meine erweiterte Antwort. – ChronoTrigger
ja ich kenne den Unterschied in der Reihenfolge der Matrix im Speicher zwischen opencv und opengl. Und ich muss auch die y- und z-Achse spiegeln (=> opencv y als opengl z verwenden, und Opencv z als opengl y verwenden) – nkint