Come calcolare la posa della telecamera dalla matrice Omografia?


13

Supponiamo di usare solo una fotocamera calibrata. Da questa fotocamera, ottengo immagini A e B. So che l'omografia tra A e B, calcolata attraverso OpenCV s' findHomography () .

Conosco la posa (matrice di rotazione R e vettore di traduzione t) dell'immagine A, e ho bisogno della posa dell'immagine B. Una volta ottenuta, suppongo che sarò in grado di calcolare ogni ulteriore posa delle seguenti immagini.

Conosci un'implementazione della posa di calcolo di B? Ho trovato diversi articoli sul Web, ma non sono riuscito a trovare una soluzione facilmente implementabile ...


Non sono sicuro di aver capito come usare il tuo codice. Uso OpenCV per recuperare l'omografia, ma quando invio quell'omografia tramite l'algoritmo, restituisce sempre questo. cameraPose [1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0]
LeRoss

Risposte:


7

Anche se la mia risposta arriva troppo tardi per te, forse altre persone lo trovano utile. Ho i codici per una posa openCV dall'omografia. Ho trovato il metodo su questo sito web davvero utile, euclideanspace .

void cameraPoseFromHomography(const Mat& H, Mat& pose)
{
    pose = Mat::eye(3, 4, CV_64FC1); //3x4 matrix
    float norm1 = (float)norm(H.col(0)); 
    float norm2 = (float)norm(H.col(1));
    float tnorm = (norm1 + norm2) / 2.0f;

    Mat v1 = H.col(0);
    Mat v2 = pose.col(0);

    cv::normalize(v1, v2); // Normalize the rotation

    v1 = H.col(1);
    v2 = pose.col(1);

    cv::normalize(v1, v2);

    v1 = pose.col(0);
    v2 = pose.col(1);

    Mat v3 = v1.cross(v2);  //Computes the cross-product of v1 and v2
    Mat c2 = pose.col(2);
    v3.copyTo(c2);      

    pose.col(3) = H.col(2) / tnorm; //vector t [R|t]
}

////


Ho usato la tua funzione nel mio codice. La matrice di posa calcolata in questo modo è sempre stata [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]. Hai qualche spiegazione?
Muhammet Ali Asan,

Stai usando la posa di A? Sembra che tu stia utilizzando solo l'ingresso H
Guig il

Questo metodo non è molto preciso, anche con una matrice di omografia calcolata direttamente da una posa nota. Il risultato può essere migliorato, tuttavia, utilizzando un processo iterativo in cui si ottiene una matrice dalla posa stimata, invertirla e applicarla all'input originale. Ottieni i parametri di posa da questa omografia dei residui, aggiorna la stima della posa e così via fino a quando non converge.
dividebyzero


0

È possibile utilizzare il metodo di decomposizione Homography implementato in Opencv 3.0+

decomposeHomographyMat

  • La funzione di Opencv restituisce una serie di possibili rotazioni, normali alle telecamere e matrici di traduzione.
  • Devi selezionare il set corretto tra loro confrontando le normali della fotocamera con la normale della fotocamera quando è stata catturata la prima immagine
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.