Für mein Augmented-Reality-Projekt habe ich ein 3D-Modell mit der VTK-Kamera und ein reales Objekt des Modells mit einer echten Kamera betrachtet.Wie wird die mit EPnP berechnete Transformation der Kamera-Pose auf die VTK-Kamera angewendet?
Ich habe EPnP verwendet, um die extrinsische Matrix der realen Kamera zu schätzen (diese Kamera wurde bereits vorher kalibriert, also kenne ich die internen Parameter), indem ich 3D - Punkte von VTK und die entsprechenden 2D - Punkte von echten Kamerabildern und interne Parameter der realen Kamera, damit der EPnP-Algorithmus funktioniert.
Danach habe ich eine Rotations-und Translationsmatrix mit den Elementen -> R1, R2, R3, ....., R9 und t1, t2 und t3 erhalten.
meine extrinsische Matrix der realen Kamera So sieht wie folgt aus (lassen Sie sich dieses extrinsicReal nennen)
R1 R2 R3 T1
R4 R5 R6 T2
R7 R8 R9 T3
0 0 0 1
Danach schätze ich die extrinsische Matrix meiner VTK Kamera mit dem folgenden Code:
vtkSmartPointer<vtkMatrix4x4> extrinsicVTK = vtkSmartPointer<vtkMatrix4x4>::New();
extrinsicVTK->DeepCopy(renderer->GetActiveCamera()->GetViewTransformMatrix());
Um das VTK-Kamera-3D-Modell mit der realen Kamera zu verschmelzen, sollte die VTK-Kamera auf eine Position eingestellt werden, die der tatsächlichen Kameraposition entspricht, und die Brennweite der VTK-Kamera sollte der der realen Kamera entsprechen . Ein weiterer wichtiger Schritt ist, die gleiche extrinsische Matrix der realen Kamera auf die VTK-Kamera anzuwenden. Wie mache ich es?
Was ich getan habe war, dass ich das Inverse der extrinsicReal genommen und multipliziert dies mit der extrinsicVTK, um eine neue 4 * 4-Matrix zu erhalten (nennen wir es newMatrix). Ich habe diese Matrix für die Transformation der VTK-Kamera angewendet.
vtkSmartPointer<vtkMatrix4x4> newMatrix = vtkSmartPointer<vtkMatrix4x4>::New();
vtkMatrix4x4::Multiply4x4(extrinsicRealInvert,extrinsicVTK,newMatrix);
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->SetMatrix(NewM);
transform->Update();
renderer->GetActiveCamera()->ApplyTransform(transform);
Ich bin nicht wirklich sicher, ob dies die richtige Methode ist. Aber ich habe die reale Kameraposition (die ich nach EPnP bekommen habe) und die VTK-Kameraposition (nach Anwendung der Transformation oben) überprüft und sie sind beide genau gleich. Auch die Ausrichtung der realen Kamera und die Projektionsrichtung der VTK-Kamera sind identisch.
Das Problem ist, dass das 3D-VTK-Modell, auch nachdem die oben genannten Parameter für die VTK und die echte Kamera übereinstimmen, nicht perfekt auf das echte Kamera-Video ausgerichtet ist. Kann mir jemand Schritt für Schritt helfen, das Problem zu beheben?
Ich möchte nur sagen, dass dies wirklich genau richtig ist. Die VTK-Dokumentation ist ein Alptraum, also ist es toll, so etwas zu finden, nachdem wir in den letzten 4 Monaten unsere Köpfe gegen eine Wand gestoßen haben. Ich habe nie die SetWindowCenter-Funktion in Betracht gezogen! Wir bekommen immer noch einen Offset, der ziemlich eindeutig auf die Fenstergröße zurückzuführen ist (Fehler ändert sich mit der Größenänderung), aber alles andere funktioniert jetzt gut, nachdem wir einige Ihrer Techniken angepasst haben. Ich fühle dich auf der VTK-Dokumentation. Es ist wirklich ein Albtraum, herauszufinden, was vor sich geht. Jemand muss das korrigieren. – SwarthyMantooth
Ich habe den applizierenden extrinsischen Teil nicht verstanden. Welche Rolle spielt die Skalenmatrix mit zwei negativen Vorzeichen? Wenn R und t die Werte aus der extrinsischen OpenCV-Matrix sind, sollte die Kameraposition "-Rinv * t" sein, und die Ansicht sollte "Rinv [:, 1]" sein und der Brennpunkt sollte "camera_pos - Rinv [:, 2 ] '. Wenn ich dies anwende, bekomme ich keine korrekte Überlagerung des Modells. Selbst wenn ich Ihre Transformation anwende, vorausgesetzt, dass m_CameraExtrinsicMatrix das Format der OpenCV-Matrix hat, bekomme ich kein korrektes Rendering. – krips89
Eine sauberere Version in der gleichen Ansatz in @ Michael's ausgezeichnete Antwort für den 'extrinsischen' Teil unten (in Python) gezeigt: (1) camera.SetPosition (* Auge) (2) camera.SetFocalPoint (* center) (3) camera.SetViewUp (* up), wobei '' 'eye = (-R'T), center = Auge + R '(0,0,1)', up = -R [0] [1]' ' ' – squid