2016-02-02 17 views
5

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?

Antwort

1

Wenn Sie die essentielle Matrix in R und t zerlegen, erhalten Sie 4 verschiedene Lösungen. Drei von ihnen projizieren die Punkte hinter einer oder beiden Kameras, und eine von ihnen ist korrekt. Sie müssen testen, welche korrekt ist, indem Sie einige Beispielpunkte triangulieren.

Es gibt eine Funktion in der Computer Vision System Toolbox in MATLAB namens cameraPose, die das für Sie tun wird.

0

Sollte es nicht C1-C2 = transpose([v2 -v1] * transpose([t s]) sein. Das funktioniert.