Comment calculer la pose de la caméra à partir de la matrice d'homographie?

13

Supposons que j'utilise un seul appareil photo calibré. De cet appareil, je reçois des images A et B. Je sais que l'homographie entre A et B, calculée par OpenCV de findHomography () .

Je connais la pose (matrice de rotation R et vecteur de translation t) de l'image A, et j'ai besoin de la pose de l'image B. Une fois que je l'aurai, je suppose que je serai capable de calculer toutes les autres poses d'images suivantes.

Connaissez-vous une implémentation du calcul de la pose de B? J'ai trouvé plusieurs articles sur le web, mais je n'ai pas trouvé de solution facilement implémentable ...

Stéphane Péchard
la source
Je ne suis pas sûr de comprendre comment utiliser votre code. J'utilise OpenCV pour récupérer l'homographie, mais lorsque j'envoie cette homographie via l'algorithme, il renvoie toujours ceci. cameraPose [1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0]
LeRoss

Réponses:

7

Même si ma réponse arrive trop tard pour vous, peut-être que d'autres personnes trouveront cela utile. J'ai les codes pour une pose openCV d'homographie. J'ai trouvé la méthode sur ce site vraiment 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]
}

////

Jav_Rock
la source
J'ai utilisé votre fonction dans mon code. La matrice de pose calculée de cette façon est toujours [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]. Avez-vous une explication?
Muhammet Ali Asan
Utilisez-vous la pose de A? Il semble que vous n'utilisiez que l'entrée H
Guig
Cette méthode n'est pas vraiment précise, même avec une matrice d'homographie calculée directement à partir d'une pose connue. Le résultat peut être amélioré, cependant, en utilisant un processus itératif où vous obtenez une matrice à partir de la pose estimée, inversez-la et appliquez-la à l'entrée d'origine. Obtenez les paramètres de pose à partir de cette homographie de résidu, mettez à jour votre estimation de pose et ainsi de suite jusqu'à ce qu'elle converge.
dividebyzero
0

Vous pouvez utiliser la méthode de décomposition Homography implémentée dans Opencv 3.0+

décomposerHomographieMat

  • La fonction d'Opencv renvoie un ensemble de rotations possibles, de normales de caméra et de matrices de traduction.
  • Vous devez sélectionner le jeu correct parmi eux en comparant les normales de la caméra avec la normale de la caméra lorsque la première image a été capturée
nbsrujan
la source