Ich habe derzeit eine Stereo-Kamera-Setup. Ich habe beide Kameras kalibriert und habe die intrinsische Matrix für beide Kameras K1
und K2
.Rotation und Translation von Essential Matrix inkorrekt
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];
Ich habe auch festgestellt, die fundamentale Matrix F
zwischen den beiden Kameras findFundamentalMat()
von OpenCV verwenden. Ich habe die Epipolar-Abhängigkeit getestet, indem ich ein Paar der entsprechenden Punkte x1
und x2
(in Pixelkoordinaten) verwendet habe, und es ist sehr nahe bei 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
Von F
Ich bin in der Lage, die Essential-Matrix E
als E = K2'*F*K1
zu erhalten. Ich zerlege E
mit der MATLAB SVD-Funktion, um die 4 Möglichkeiten der Rotation und Translation von K2
in Bezug auf K1
zu erhalten.
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
Lasst uns sagen, dass K1
als Koordinatenrahmen verwendet wird, für die wir alle Messungen machen. Daher ist das Zentrum von K1
bei C1 = (0,0,0)
. Damit sollte es möglich sein, die richtige Drehung R
und Übersetzung t
so dass C2 = R*(0,0,0)+t
(das heißt das Zentrum von K2
gemessen in Bezug auf das Zentrum von K1
)
Jetzt anwenden lassen Sie uns sagen, dass meine entsprechende Paare x1
und x2
verwenden. Wenn ich die Länge jedes Pixels in meinen beiden Kameras kenne und ich die Brennweite von der intrinsischen Matrix kenne, sollte ich zwei Vektoren v1
und v2
für beide Kameras bestimmen können, die sich an der gleichen Stelle wie unten schneiden.
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
mit diesem Vektor und die Geradengleichung in parametrischer Form zu kennen, können wir dann gleichzusetzen, die beiden Linien, die die zwei skalare Größen s und t
durch die linke Hand Divide-Funktion in MATLAB triangulieren und Lösung für das System zu lösen, von Gleichungen.
C1 + s*v1 = C2 + t*v2
C1-C2 = tranpose([v2 v1])*transpose([s t]) //solve Ax = B form system to find s and t
Mit s
und t
stellten wir fest, die trianguliert Punkt durch Aufstecken wieder in die Linie Gleichung finden. Mein Prozess war jedoch nicht erfolgreich, da ich keine einzige R
und t
Lösung finden kann, bei der der Punkt vor beiden Kameras liegt und beide Kameras nach vorne zeigen.
Ist etwas falsch mit meiner Pipeline oder Gedankenprozess? Ist es überhaupt möglich, jeden einzelnen Pixelstrahl zu erhalten?