2016-02-02 58 views
5

我目前有一個立體相機設置。我已經校準了兩臺攝像機,併爲兩臺攝像機K1K2設置了固有矩陣。從基本矩陣旋轉和翻譯不正確

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]; 

我還確定使用從findFundamentalMat() OpenCV的兩個攝像機之間的基本矩陣F。我已經使用一對對應點x1x2(以像素座標)測試了極線約束,並且它非常接近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 

F我能夠獲得基本矩陣EE = K2'*F*K1。我使用MATLAB SVD函數分解E以獲得K2相對於K1的4種可能的旋轉和平移。

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 

假設我們使用K1作爲我們進行所有測量的座標系。因此,K1的中心位於C1 = (0,0,0)。有了這一點,應該可以應用正確的旋轉R和翻譯t這樣C2 = R*(0,0,0)+t(即K2中心相對於的K1中心測量)

現在,讓我們說,用我的相應對x1x2。如果我知道兩個相機中每個像素的長度,並且由於我知道固有矩陣的焦距,我應該能夠確定兩個矢量v1v2,這兩個相機在相同點處相交,如下所示。

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 

用該載體並知道在參數形式的直線方程,我們就可以等同兩條線進行三角測量,並通過在MATLAB左手除法功能解決這兩個標量S和t以求解系統的等式。

C1 + s*v1 = C2 + t*v2 
C1-C2 = tranpose([v2 v1])*transpose([s t]) //solve Ax = B form system to find s and t 

隨着st確定的,我們可以通過插入回線方程找到三角點。然而,我的過程並沒有成功,因爲我找不到一個單一的Rt解決方案,其中兩個攝像頭前面的點和兩個攝像頭都指向前方。

我的管道或思考過程有什麼問題嗎?完全可能獲得每個單獨的像素射線嗎?

回答

1

當您將基本矩陣分解爲Rt時,您會得到4種不同的解決方案。其中三個投影點在一個或兩個相機後面,其中一個是正確的。你必須通過三角測量一些採樣點來測試哪一個是正確的。

MATLAB中的計算機視覺系統工具箱中有一項功能叫做cameraPose,它可以幫你實現這個功能。

0

它應該不是C1-C2 = transpose([v2 -v1] * transpose([t s])。這工作。