Ich verwende "OpenCV for Unity3d" (es ist dasselbe OpenCV-Paket für Java, aber übersetzt in C# für Unity3d), um eine Augmented Reality-Anwendung zu erstellen für meine Masterarbeit (Informatik).OpenCV-Rotation (Rodrigues) und Übersetzungsvektoren zum Positionieren von 3D-Objekten in Unity3D
Bisher bin ich in der Lage, ein Objekt von Videorahmen mit ORB-Feature-Detektor zu erkennen und auch die 3D-zu-2D-Beziehung mit OpenCVs SolvePnP-Methode zu finden (ich habe auch die Kamerakalibrierung durchgeführt). Von dieser Methode bekomme ich die Translation und Rotation Vektoren. Das Problem tritt bei der Augmentationsphase auf, wo ich ein 3D-Objekt als virtuelles Objekt zeigen und seine Position und Rotation bei jedem Frame aktualisieren muss. OpenCV gibt die Rodrigues-Rotationsmatrix zurück, aber Unity3d arbeitet mit der Quaternion-Rotation, so dass ich die Position und Drehung des Objekts falsch aktualisiere, und ich kann nicht herausfinden, wie das Umstellungsforum (von Rodrigues nach Quaternion) implementiert wird.
gibt es die rvec und TVEC:
Mat rvec = new Mat();
Mat tvec = new Mat();
Mat rotationMatrix = new Mat();
Calib3d.solvePnP (object_world_corners, scene_flat_corners, CalibrationMatrix, DistortionCoefficientsMatrix, rvec, tvec);
Calib3d.Rodrigues (rvec, rotationMatrix);
die Position des virtuellen Objekts aktualisiert:
Vector3 objPosition = new Vector3();
objPosition.x = (model.transform.position.x + (float)tvec.get (0, 0)[0]);
objPosition.y = (model.transform.position.y + (float)tvec.get (1, 0)[0]);
objPosition.z = (model.transform.position.z - (float)tvec.get (2, 0)[0]);
model.transform.position = objPosition;
ich ein Minuszeichen für die Z-Achse haben, denn wenn man OpenCV ist zu Unty3d System konvertieren koordinieren Sie müssen die Z-Achse invertieren (ich habe die Systemkoordinaten selbst überprüft).
Unity3d Koordinatensystem (Grün ist Y, Rot X und Blau ist Z):
OpenCV Koordinatensystem:
Dazu habe ich die gleiche Sache tat für die Rotationsmatrix und ich aktualisierte die Rotation des virtuellen Objekts.
ps. Ich fand eine ähnliche Frage, aber der Typ, der danach gefragt hat, hat die Lösung nicht eindeutig gepostet.
Danke!
Jetzt machen alle Sinn :) Übrigens denke ich, dass mein Übersetzungsvektor falsch ist. Das 3D-Objekt bewegt sich in der Szene falsch! Was mache ich da falsch? – user43053534
Für die Position, invertieren Sie die Y-Koordinate, wie Sie für Orientierungsvektoren tun müssen. Eine wirklich wichtige Sache zu beachten: Z-Achse ist die optische Achse der Kamera, die im Allgemeinen nicht durch Bildmitte geht. Zu Ihren Kalibrierungsparametern gehören Cx- und Cy-Parameter. Diese sind der 2D-Versatz im Bildraum von der Bildmitte, den die optische Achse der Kamera (Z-Achse) im Bild durchläuft. Wirklich wichtig, 3D Sachen über 2D Hintergrund für AR Anwendungen abzubilden! – RCYR
Also welche Änderungen müssen vorgenommen werden, damit es richtig funktioniert? Nach der Kamerakalibrierung habe ich die intrinsischen Parameter der Kamera erhalten. Wie muss ich sie verwenden, um das virtuelle Objekt richtig zu positionieren? – user43053534