2012-09-30 8 views
5

Ho due immagini catturate da due fotocamere dello stesso marchio posizionate a una certa distanza, catturando la stessa scena. Voglio calcolare la rotazione e la traduzione del mondo reale tra le due fotocamere. Per ottenere questo, ho prima estratto le caratteristiche SIFT di entrambe le immagini e le ho abbinate.Geometria a vista multipla

ora ho matrice fondamentale nonché dell'omografia matrice. Tuttavia, incapace di procedere ulteriormente, molta confusione. Qualcuno può aiutarmi a stimare la rotazione e la traduzione tra due fotocamere?

Sto utilizzando OpenCV per l'estrazione e l'abbinamento di funzioni, calcoli di omografia.

risposta

5

Se hai l'omografia, hai anche la rotazione. Una volta ottenuta l'omografia, è facile ottenere la rotazione e la matrice di traduzione.

Ad esempio, se si sta utilizzando OpenCV C++:

param[in] H 
param[out] pose 
void cameraPoseFromHomography(const Mat& H, Mat& pose) 
{ 
    pose = Mat::eye(3, 4, CV_32FC1);  // 3x4 matrix, the camera pose 
    float norm1 = (float)norm(H.col(0)); 
    float norm2 = (float)norm(H.col(1)); 
    float tnorm = (norm1 + norm2)/2.0f; // Normalization value 

    Mat p1 = H.col(0);  // Pointer to first column of H 
    Mat p2 = pose.col(0); // Pointer to first column of pose (empty) 

    cv::normalize(p1, p2); // Normalize the rotation, and copies the column to pose 

    p1 = H.col(1);   // Pointer to second column of H 
    p2 = pose.col(1);  // Pointer to second column of pose (empty) 

    cv::normalize(p1, p2); // Normalize the rotation and copies the column to pose 

    p1 = pose.col(0); 
    p2 = pose.col(1); 

    Mat p3 = p1.cross(p2); // Computes the cross-product of p1 and p2 
    Mat c2 = pose.col(2); // Pointer to third column of pose 
    p3.copyTo(c2);  // Third column is the crossproduct of columns one and two 

    pose.col(3) = H.col(2)/tnorm; //vector t [R|t] is the last column of pose 
} 

Questa funzione calcola de fotocamera posa da omografia, in cui la rotazione è contenuto. Per ulteriori informazioni teoriche segui questo thread.

+0

Grazie @Jav_Rock, la tua risposta mi ha aiutato a valutare la posa. Tuttavia, per qualsiasi set di immagini, la matrice di posa è la stessa, le prime tre colonne formano una matrice di identità e l'ultima colonna è vuota. Hai qualche idea su questo? – Aarambh

+0

Ho anche confermato la matrice di omografia usando warpAffine, che mappa correttamente la vista di un'immagine su un'altra. – Aarambh

+0

@ user1709317: 'H' e' pose' devono essere dello stesso formato. Probabilmente otterrai i risultati desiderati cambiando 'CV_32FC1'->' CV_64FC1'. – bjoernz