Attualmente ho una configurazione stereo della fotocamera. Ho calibrato entrambe le telecamere e ho la matrice intrinseca per entrambe le fotocamere K1
e K2
.Rotazione e traduzione da Essential Matrix errate
K1 = [2297.311, 0, 319.498;
0, 2297.313, 239.499;
0, 0, 1];
K2 = [2297.304, 0, 319.508;
0, 2297.301, 239.514;
0, 0, 1];
ho anche determinata la matrice fondamentale F
tra le due telecamere utilizzando findFundamentalMat()
da OpenCV. Ho testato il vincolo Epipolar utilizzando una coppia di punti corrispondenti x1
e x2
(in coordinate pixel) ed è molto vicino a 0
.
F = [5.672563368940768e-10, 6.265600996978877e-06, -0.00150188302445251;
6.766518121363063e-06, 4.758206104804563e-08, 0.05516598334827842;
-0.001627120880791009, -0.05934224611334332, 1];
x1 = 133,75
x2 = 124.661,67.6607
transpose(x2)*F*x1 = -0.0020
Da F
io sono in grado di ottenere la matrice essenziale E
come E = K2'*F*K1
. Decompongo E
utilizzando la funzione SVL MATLAB per ottenere le 4 possibilità di rotazione e traduzione di K2
rispetto a K1
.
E = transpose(K2)*F*K1;
svd(E);
[U,S,V] = svd(E);
diag_110 = [1 0 0; 0 1 0; 0 0 0];
newE = U*diag_110*transpose(V);
[U,S,V] = svd(newE); //Perform second decompose to get S=diag(1,1,0)
W = [0 -1 0; 1 0 0; 0 0 1];
R1 = U*W*transpose(V);
R2 = U*transpose(W)*transpose(V);
t1 = U(:,3); //norm = 1
t2 = -U(:,3); //norm = 1
Diciamo che K1
viene utilizzato come telaio di coordinate per cui facciamo tutte le misurazioni. Pertanto, il centro di K1
è C1 = (0,0,0)
. Con questo dovrebbe essere possibile applicare la corretta rotazione R
e traduzione t
tale che C2 = R*(0,0,0)+t
(cioè il centro di K2
è misurata rispetto al centro di K1
)
Ora diciamo che usando le coppie corrispondenti x1
e x2
. Se conosco la lunghezza di ciascun pixel in entrambe le fotocamere e poiché conosco la lunghezza focale della matrice intrinseca, dovrei essere in grado di determinare due vettori v1
e v2
per entrambe le telecamere che si intersecano nello stesso punto come visto di seguito.
pixel_length = 7.4e-6; //in meters
focal_length = 17e-3; //in meters
dx1 = (133-319.5)*pixel_length; //x-distance from principal point of 640*480 image
dy1 = (75-239.5) *pixel_length; //y-distance from principal point of 640*480 image
v1 = [dx1 dy1 focal_length] - (0,0,0); //vector found using camera center and corresponding image point on the image plane
dx2 = (124.661-319.5)*pixel_length; //same idea
dy2 = (67.6607-239.5)*pixel_length; //same idea
v2 = R * ([dx2 dy2 focal_length] - (0,0,0)) + t; //apply R and t to measure v2 with respect to K1 frame
Con questo vettore e conoscendo l'equazione linea in forma parametrica, possiamo equiparare le due linee di triangolare e risolvere le due quantità scalari s e t
attraverso la funzione di divisione di sinistra in MATLAB per risolvere il sistema di equazioni.
C1 + s*v1 = C2 + t*v2
C1-C2 = tranpose([v2 v1])*transpose([s t]) //solve Ax = B form system to find s and t
Con s
e t
determinati possiamo trovare il punto triangolato collegando indietro nell'equazione di linea. Tuttavia, il mio processo non ha avuto successo in quanto non riesco a trovare una singola soluzione R
e t
in cui il punto si trova di fronte a entrambe le telecamere e dove entrambe le telecamere sono puntate in avanti.
C'è qualcosa di sbagliato nella mia pipeline o processo di pensiero? È possibile ottenere ogni singolo raggio di pixel?