Sto provando a calcolare una nuova posizione della telecamera in base al movimento delle immagini corrispondenti. le immagini sono conformi al modello di telecamera pinhole.Movimento della telecamera dalle immagini corrispondenti
In effetti, non ottengo risultati utili, quindi cerco di descrivere la mia procedura e spero che qualcuno possa aiutarmi.
Corrispondono alle caratteristiche delle immagini corrispondenti con SIFT, le combino con FlannBasedMatcher di OpenCV e calcoliamo la matrice fondamentale con findFundamentalMat (metodo RANSAC) di OpenCV.
Poi calcolare la matrice essenziale dalla telecamera matriciale intrinseca (K):
Mat E = K.t() * F * K;
I decompongono la matrice essenziale di rotazione e traslazione con singolare decomposizione in valori:
SVD decomp = SVD(E);
Matx33d W(0,-1,0,
1,0,0,
0,0,1);
Matx33d Wt(0,1,0,
-1,0,0,
0,0,1);
R1 = decomp.u * Mat(W) * decomp.vt;
R2 = decomp.u * Mat(Wt) * decomp.vt;
t1 = decomp.u.col(2); //u3
t2 = -decomp.u.col(2); //u3
Poi provo per trovare la soluzione corretta per triangolazione. (questa parte è da http://www.morethantechnical.com/2012/01/04/simple-triangulation-with-opencv-from-harley-zisserman-w-code/ quindi penso che dovrebbe funzionare correttamente).
La nuova posizione viene quindi calcolato con:
new_pos = old_pos + -R.t()*t;
dove New_Pos & old_pos sono vettori (3x1), R la matrice di rotazione (3x3) e T il vettore di traslazione (3x1).
Purtroppo non ho ottenuto risultati utili, quindi forse qualcuno ha un'idea di cosa potrebbe essere sbagliato.
Ecco alcuni risultati (solo nel caso in cui qualcuno può confermare che nessuno di loro è sicuramente sbagliato):
F = [8.093827077399547e-07, 1.102681999632987e-06, -0.0007939604310854831;
1.29246107737264e-06, 1.492629957878578e-06, -0.001211264339006535;
-0.001052930954975217, -0.001278667878010564, 1]
K = [150, 0, 300;
0, 150, 400;
0, 0, 1]
E = [0.01821111092414898, 0.02481034499174221, -0.01651092283654529;
0.02908037424088439, 0.03358417405226801, -0.03397110489649674;
-0.04396975675562629, -0.05262169424538553, 0.04904210357279387]
t = [0.2970648246214448; 0.7352053067682792; 0.6092828956013705]
R = [0.2048034356172475, 0.4709818957303019, -0.858039396912323;
-0.8690270040802598, -0.3158728880490416, -0.3808101689488421;
-0.4503860776474556, 0.8236506374002566, 0.3446041331317597]
C'è ancora un errore nel calcolo. 'SVD decomp = SVD (E);' è ok ma devi calcolare un nuovo 'newE = U * diag (1,1,0) * Vt' e poi di nuovo devi avere' SVD decomp2 = SVD (newE) ; '. – who9vy
interessante. Non ho mai letto su questo. Quindi devo calcolare R e t con decomp2? btw: grazie per la tua risposta dettagliata. Devo controllare tutte le cose e risponderò il prima possibile. – 3x14159265
Sì, devi calcolare R e t con decomp2. Qui viene fornita una descrizione dettagliata (pagg. 257-260) http://www.robots.ox.ac.uk/~vgg/hzbook/hzbook2/HZepipolar.pdf – who9vy