Como calcular a pose da câmera a partir da matriz Homography?

13

Digamos que eu use apenas uma câmera calibrada. A partir desta câmera, obtenho as imagens A e B. Conheço a homografia entre A e B, calculada através do findHomography () do OpenCV .

Conheço a pose (matriz de rotação R e o vetor de tradução t) da imagem A e preciso da pose da imagem B. Depois de obtê-la, suponho que poderei calcular todas as outras poses das imagens a seguir.

Você conhece uma implementação da computação da pose de B? Encontrei vários artigos na Web, mas não consegui encontrar uma solução facilmente implementável ...

Stéphane Péchard
fonte
Não sei se entendi como usar seu código. Eu uso o OpenCV para recuperar a homografia, mas quando eu a envio através do algoritmo, ela sempre retorna isso. cameraPose [1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0]
LeRoss 23/04

Respostas:

7

Mesmo que minha resposta seja tarde demais para você, talvez outras pessoas achem isso útil. Eu tenho os códigos para uma pose openCV da homografia. Encontrei o método neste site 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
fonte
Eu usei sua função no meu código. A matriz de pose calculada dessa maneira está sempre sendo [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]. Você tem alguma explicação?
Muhammet Ali Asan
Você está usando a pose de A? Parece que você está usando apenas a entrada H
Guig
Este método não é realmente preciso, mesmo com uma matriz de homografia calculada diretamente de uma pose conhecida. O resultado pode ser aprimorado, no entanto, usando um processo iterativo em que você obtém uma matriz a partir da pose estimada, inverte-a e aplica-a à entrada original. Obtenha os parâmetros de pose dessa homografia de resíduo, atualize sua estimativa de pose e assim por diante até convergir.
dividebyzero 02/02
3

Encontrei uma boa implementação, usando o OpenCV: http://nghiaho.com/?p=1298

Stéphane Péchard
fonte
0

Você pode usar o método de decomposição da homografia implementado no Opencv 3.0+

decomposeHomographyMat

  • A função Opencv retorna um conjunto de possíveis rotações, normais da câmera e matrizes de conversão.
  • Você deve selecionar o conjunto correto entre eles, comparando os normais da câmera com os normais da câmera quando a primeira imagem foi capturada.
nbsrujan
fonte