2011-07-26 10 views
5

Estoy tratando de recuperar el movimiento de una cámara utilizando la matriz fundamental , y el algoritmo como figura en Wikipedia [1]. Para , necesito encontrar la matriz fundamental. Estoy usando OpenCV :: findFundamentalMat para esto.FindFundamentalMatrix no encuentra la matriz fundamental

Dos comportamientos inesperados: 1) El uso de diferentes algoritmos de ajuste produce resultados diferentes, especialmente FM_8POINT es diferente. 2) Dado un conjunto de pares de puntos (y, x), yFx = 0 no se cumple y es siempre mayor que 0.

¿No he entendido algo aquí? ¿Mi ejemplo es falso o qué está pasando? ¿Alguien puede sugerir un mejor ejemplo de prueba?

A continuación se muestra un ejemplo mínimo. Crea 12 puntos artificiales, cambia cada uno de esos puntos 10 píxeles a la derecha, encuentra la matriz fundamental de estos dos conjuntos de puntos e imprime yFx para cada punto.

Ejemplo:

int main(int argc, const char* argv[]) 
{ 
    // Create two sets of points. Points in pts2 are moved 10pixel to the right of the points in pts1. 
    std::vector<cv::Point2f> pts1, pts2; 
    for(double y = 0; y < 460; y+=150) 
    { 
      for(double x= 0; x < 320; x += 150) 
      { 
        pts1.push_back(cv::Point2f(x, y)); 
        pts2.push_back(cv::Point2f(x+10.0, y)); 
      } 
    } 

    cv::Mat F = cv::findFundamentalMat(pts1, pts2); 

    for(int i = 0; i < pts1.size(); i++) 
    { 
      // Creating p1, p2, the two points. Please let me know if this can be done in fewer lines. 
      cv::Mat p1(3,1, CV_64FC1), p2(3,1, CV_64FC1); 

      p1.at<double>(0) = pts1.at(i).x; 
      p1.at<double>(1) = pts1.at(i).y; 
      p1.at<double>(2) = 1.0; 

      p2.at<double>(0) = pts2.at(i).x; 
      p2.at<double>(1) = pts2.at(i).y; 
      p2.at<double>(2) = 1.0; 

      // Print yFx for each pair of points. This should be 0 for all. 
      cout << p1.t() * F * p2 << endl; 
    } 
} 

Para FM_RANSAC llego [1.999], [2], [2], [1.599], [1.599], [1.599], [1.198], [1.198], [1.198], [0.798], [0.798], [0.798]

Para FM_8POINT, la matriz fundamental es ceros (3,3) y, por lo tanto, yFx es 0 para todos y, x.

Encontré solamente: T and R estimation from essential matrix pero eso no ayudó mucho.

EDITAR: yFx es el camino equivocado (p1/p2 conmutados en la línea de comandos). Este es un ejemplo que tampoco funciona porque todos los puntos se encuentran en un plano.

Respuesta

3

Creo que la matriz fundamental resuelve la ecuación p2.t() * F * p1 = 0, es decir, tiene p1 y p2 invertidos en su código. En cuanto a por qué el algoritmo de 8 puntos está devolviendo la matriz cero, no tengo ni idea, lo siento.

Editar: De acuerdo, creo recordar por qué el algoritmo de 8 puntos está produciendo un mal resultado aquí. Su movimiento entre los dos conjuntos de puntos es traducción pura sin rotación, es decir, solo tiene tres grados de libertad. La matriz fundamental tiene 7 grados de libertad, por lo que es imposible de estimar; esto se llama un caso degenerado. Ver this paper para una descripción más detallada de los casos degenerados en la estimación de la matriz fundamental/esencial.

También podría darse el caso de que no haya una transformación rígida entre los dos puntos de vista que obtienes moviendo artificialmente las coordenadas de píxeles, por lo que no existe una matriz fundamental que satisfaga los requisitos. Un mejor caso de prueba podría ser el uso de una función como cv :: warpPerspective con una matriz warp conocida.

+0

bien, tuve P2 y P1 al revés. Gracias por detectar eso. Echaré un vistazo al periódico ahora, y luego Hartley y Zisserman estarán a la vuelta de la esquina, tal vez puedan ayudar. – Unapiedra

1

1) El uso de diferentes algoritmos de ajuste produce resultados diferentes, especialmente FM_8POINT es diferente.

Diferentes métodos no dan el mismo resultado, es cierto:

  • por ejemplo RANSAC (Consenso muestra aleatoria) es el método por defecto en findFundamentalMat(), que calcula los parámetros de la transformación con una conjunto de puntos que contiene algunos puntos aleatorios que son valores atípicos anteriores, produce un resultado correcto con una cierta probabilidad.
  • mientras FM_8POINT está diseñado para encontrar los parámetros con 8points y utilizando un sistema con las ecuaciones linealmente independientes ..

2) Dado un conjunto de pares de puntos (y, x), YFX = 0 no es cumplido y es siempre mayor que 0.

significa que el fundamentalMatrix que encontraste no es correcta (con una mala estimación), que se debe a la traducción pura que le dio como una entrada, que en el sector, no es posible (es el caso degenerado de 2 imágenes con un punto de vista ubicado en el infinito ... (see epipolar geometry)

espero que te ayudó ... Julien,

Cuestiones relacionadas