Per il mio progetto di realtà aumentata, ho un modello 3D visualizzato utilizzando la fotocamera VTK e un oggetto reale del modello visualizzato utilizzando una fotocamera reale.Come applicare la trasformazione della posa della telecamera calcolata usando EPnP alla videocamera VTK?
Ho utilizzato EPnP per stimare la matrice estrinseca della videocamera reale (questa fotocamera è già stata calibrata prima della mano, quindi conosco i parametri interni) fornendo punti 3D da VTK e i corrispondenti punti 2D dall'immagine della telecamera reale e parametri interni della camera reale per il funzionamento dell'algoritmo EPnP.
Successivamente, ho ottenuto una matrice di rotazione e traslazione con gli elementi -> R1, R2, R3, ....., R9 e t1, t2 e t3.
Quindi la mia matrice estrinseca della vera fotocamera si presenta così (chiamiamolo questo extrinsicReal)
R1 R2 R3 T1
R4 R5 R6 T2
R7 R8 R9 T3
0 0 0 1
Dopo questo, ho stima la matrice estrinseca della mia macchina fotografica VTK utilizzando il seguente codice:
vtkSmartPointer<vtkMatrix4x4> extrinsicVTK = vtkSmartPointer<vtkMatrix4x4>::New();
extrinsicVTK->DeepCopy(renderer->GetActiveCamera()->GetViewTransformMatrix());
Per fondere il modello 3D della videocamera VTK con la fotocamera reale, la videocamera VTK deve essere impostata su una posizione uguale a quella della posizione reale della videocamera e la lunghezza focale della videocamera VTK deve essere uguale a quella della fotocamera reale . Un altro passo importante è quello di applicare la stessa matrice estrinseca della videocamera reale alla videocamera VTK. Come lo faccio?
Quello che ho fatto è stato l'inverso di extrinsicReal e l'ho moltiplicato con l'extrinsicVTK per ottenere una nuova matrice 4 * 4 (chiamiamola newMatrix). Ho applicato questa matrice per la trasformazione della videocamera VTK.
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);
Non sono sicuro se questo è il metodo corretto. Ma ho controllato la posizione reale della telecamera (che ho ottenuto dopo EPnP) e la posizione della videocamera VTK (dopo aver applicato la trasformazione sopra) e sono entrambi esattamente uguali. Inoltre, l'orientamento della camera reale e la direzione di proiezione della videocamera VTK sono uguali.
Il problema è che anche dopo aver abbinato i parametri di cui sopra sia al VTK che alla telecamera reale, il modello 3D VTK non sembra essere perfettamente allineato al video della telecamera reale. Qualcuno può guidarmi passo passo per eseguire il debug del problema?
Voglio solo dire che questo è davvero perfetto. La documentazione VTK è un incubo quindi è bello incappare in qualcosa di simile dopo aver sbattuto la testa contro un muro negli ultimi 4 mesi. Non ho mai considerato la funzione SetWindowCenter! Stiamo ancora ottenendo un offset che è chiaramente dovuto alla dimensione della finestra (modifiche all'errore con il ridimensionamento), ma tutto il resto funziona alla grande ora che abbiamo adattato alcune delle tue tecniche. Mi sento nella documentazione VTK. È davvero un incubo capire cosa sta succedendo. Qualcuno deve correggerlo. – SwarthyMantooth
Non ho capito l'applicazione della parte estrinseca. Qual è il ruolo della matrice di scala con due segni negativi? Se R e t sono i valori della matrice estrinseca OpenCV, la posizione della telecamera dovrebbe essere '-Rinv * t', e la vista dovrebbe essere' Rinv [:, 1] 'e il punto focale dovrebbe essere' camera_pos - Rinv [:, 2 ] '. Quando lo applico, non ottengo una corretta sovrapposizione del modello. Anche quando applico la tua trasformazione assumendo che m_CameraExtrinsicMatrix abbia il formato di matrice OpenCV, non ottengo il rendering corretto. – krips89
Una versione più pulita nello stesso approccio ha sottolineato nell'eccellente risposta di @ Michael per la parte "estrinseca" di seguito (in python): (1) camera.SetPosition (* eye) (2) camera.SetFocalPoint (* center) (3) camera.SetViewUp (* su), dove '' 'eye = (-R'T), center = eye + R '(0,0,1)', up = -R [0] [1]' ' ' – squid