2011-04-04 18 views
6

Sto provando a scrivere del codice che calcolerà la matrice fondamentale per determinare la relazione tra le immagini stereo. Ho iniziato con il libro di Hartley e Zisserman che la maggior parte delle persone consiglia, ma non aveva esempi pratici e il codice di esempio era in MATLAB che non ho. Poi sono passato a An introduction to 3D Computer Vision Techniques and Algorithms che è più pratico e contiene esempi reali. Ho implementato l'algoritmo consigliato in 8 punti usando Python e numpy, ma ho difficoltà a verificarne la validità.Come calcolare la matrice fondamentale per la visione stereo

Sto utilizzando il set di dati elencato a pagina 48 (utilizzare quel link sopra per vedere un estratto di Google Libri) di quel libro. Quando normalizzo i punti, ottengo gli stessi risultati di quel libro. Tuttavia, quando uso funzione SVD di numpy per calcolare la matrice fondamentale, ottengo il seguente valore di F:

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

Questa matrice soddisfa l'equazione p_R^* F * p_L = 0 così sembra corretto. Tuttavia, è molto diverso dalla matrice calcolata nel libro. Ho cercato di controllare due volte la risposta utilizzando cv.FindFundamentalMat di OpenCV() e ho ottenuto una terza risposta:

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

Non sto Come vengono calcolati gli altri due matrici, ma non riesco a trovare alcun esempio di fondamentale calcolo a matrice sul web per verificare la mia implementazione dell'algoritmo a 8 punti. Il fatto che la mia implementazione restituisca un valore che soddisfa l'equazione mi dà fiducia, ma sono preoccupato di aver fatto qualcosa di sciocco, motivo per cui non posso abbinare i risultati del libro o di OpenCV.

+0

hai iniziato con i punti normalizzati dal set di dati o con i punti originali per ottenere le due matrici fondamentali sopra? –

risposta

5

Si noti che la matrice fondamentale è definita fino a un fattore costante (è possibile verificarlo abbastanza facilmente, controllando il vincolo epipolare). Prova a moltiplicare la matrice OpenCV con -8.0574e-04 e vedrai che le due matrici sono abbastanza simili alla fine :-)

Pertanto, il risultato è probabilmente soddisfacente. La leggera differenza tra i risultati è probabilmente dovuta al fatto che OpenCV utilizza un approccio diverso (probabilmente più robusto) rispetto all'algoritmo a 8 punti.

+0

Sapevo che sarebbe stato qualcosa di sciocco che mi mancava. Grazie per l'aiuto. – SigmaXiPi