2011-04-04 30 views
6

Estoy tratando de escribir algún código que calcule la matriz fundamental para determinar la relación entre las imágenes estéreo. Comencé con el libro de Hartley y Zisserman que la mayoría de la gente recomienda, pero no tenía ningún ejemplo práctico y el código de muestra estaba en MATLAB y no lo tengo. Luego cambié al An introduction to 3D Computer Vision Techniques and Algorithms que es más práctico y tiene ejemplos reales en él. Implementé el algoritmo de 8 puntos recomendado usando Python y numpy, pero estoy teniendo problemas para verificar su validez.Cómo calcular la matriz fundamental para la visión estéreo

Estoy usando el conjunto de datos listado en la página 48 (use ese enlace de arriba para ver un extracto de Google Books) de ese libro. Cuando normalizo los puntos, obtengo los mismos resultados que ese libro. Sin embargo, cuando se utiliza la función SVD de numpy para calcular la matriz fundamental, me sale el siguiente valor para F:

[[-0.01851684 -0.21631176 -0.67036356] 
[ 0.2605251 -0.01023853 0.14234079] 
[ 0.63748775 -0.09404508 -0.00220713]] 

Esta matriz satisface la P_R ecuación ^* F * P_L = 0 por lo que parece correcto. Sin embargo, es muy diferente de la matriz calculada en el libro. Traté de doblar comprobar la respuesta usando cv.FindFundamentalMat de OpenCV() y me dieron una tercera respuesta:

[[ 22.98129082 271.46453857 853.74273682] 
[-334.1673584 -4.84123087 -175.99523926] 
[-809.88891602 125.99833679 1.  ]] 

No estoy cómo se calculan los otros dos matrices, pero no puedo encontrar ningún ejemplo de fundamental cálculo matricial en la web para verificar mi implementación del algoritmo de 8 puntos. El hecho de que mi implementación arroje un valor que satisfaga la ecuación me da confianza, pero me preocupa haber hecho algo tonto y es por eso que no puedo hacer coincidir los resultados en el libro o OpenCV.

+0

¿comenzó con los puntos normalizados de su conjunto de datos o con los puntos originales para llegar a las dos matrices fundamentales anteriores? –

Respuesta

5

Tenga en cuenta que la matriz fundamental se define hasta un factor constante (puede verificar eso con bastante facilidad, verificando la restricción epipolar). Intente multiplicar la matriz OpenCV con -8.0574e-04 y verá que las dos matrices son bastante similares al final :-)

Por lo tanto, su resultado probablemente sea correcto. La ligera diferencia entre los resultados probablemente se deba al hecho de que OpenCV emplea un enfoque diferente (probablemente más sólido) que el algoritmo de 8 puntos.

+0

Sabía que iba a ser algo tonto que me perdí. Gracias por la ayuda. – SigmaXiPi

Cuestiones relacionadas