¿Cómo calcular la pose de la cámara desde la matriz de homografía?

13

Digamos que uso solo una cámara calibrada. Desde esta cámara, consigo las imágenes A y B. Me conocen la homografía entre A y B, calculada a través OpenCV 's findHomography () .

Conozco la pose (matriz de rotación R y vector de traducción t) de la imagen A, y necesito la pose de la imagen B. Una vez que la obtenga, supongo que podré calcular todas las poses de las siguientes imágenes.

¿Conoces una implementación de la pose de computación B? Encontré varios artículos en la web, pero no pude encontrar una solución fácilmente implementable ...

Stéphane Péchard
fuente
No estoy seguro de entender cómo usar su código. Uso OpenCV para recuperar la Homografía, pero cuando envío esa Homografía a través del algoritmo, siempre devuelve esto. cameraPose [1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0]
LeRoss

Respuestas:

7

Incluso si mi respuesta llega demasiado tarde para ti, tal vez otras personas encuentren esto útil. Tengo los códigos para una pose de openCV de Homography. Encontré el método en este sitio web realmente útil, 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
fuente
He usado su función en mi código. La matriz de puntos calculada de esta manera siempre es [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]. ¿Tienes alguna explicación?
Muhammet Ali Asan
¿Estás usando la pose de A? Parece que solo estás usando la entrada H
Guig
Este método no es realmente preciso, incluso con una matriz de homografía calculada directamente a partir de una pose conocida. Sin embargo, el resultado puede mejorarse mediante un proceso iterativo en el que obtiene una matriz de la pose estimada, invierte y aplica a la entrada original. Obtenga los parámetros de pose de esta homografía de residuos, actualice su estimación de pose y así sucesivamente hasta que converja.
dividebyzero
0

Puede usar el método de descomposición de homografía implementado en Opencv 3.0+

descomponerHomographyMat

  • La función de Opencv devuelve un conjunto de rotaciones posibles, normales de cámara y matrices de traducción.
  • Debe seleccionar el conjunto correcto entre ellos comparando las normales de la cámara con la normal de la cámara cuando se capturó la primera imagen
nbsrujan
fuente