2016-03-15 70 views
0

我使用立體聲系統,所以我試圖獲得一些點的世界座標。我可以對每臺相機進行特定的校準,然後計算旋轉矩陣和平移矢量。最後我做了三角測量,但我不確定世界座標的起源。Opencv - 立體聲系統的三角起源

正如您在我的身材上所看到的,值與深度值相對應,但它們應接近400,因爲它是平坦的。所以我想,該原點是左攝像頭,爲什麼它個變量...

enter image description here

一塊我的代碼和我的投影陣列和三角測量功能:

#C1 and C2 are the cameras matrix (left and rig) 
#R_0 and T_0 are the transformation between cameras 
#Coord1 and Coord2 are the correspondant coordinates of left and right respectively 
P1 = np.dot(C1,np.hstack((np.identity(3),np.zeros((3,1))))) 

P2 =np.dot(C2,np.hstack(((R_0),T_0))) 

for i in range(Coord1.shape[0]) 
    z = cv2.triangulatePoints(P1, P2, Coord1[i,],Coord2[i,]) 

我的相機存在一個角度,Z軸方向(深度方向)不正常於我的表面。我想要從基線方向的深度。所以我必須旋轉我的觀點?

enter image description here

+1

使用身份和零翻譯意味着一切都按照C1座標系計算,C1傳感器是原點。 – Thesane

+0

好吧,但對於我不得不做的三角測量呢?如果我想「運輸」一個具有標準的地標與我的表面如何做到這一點?這是一種「剛體運動」轉變?感謝您的幫助;) – user3601754

+0

您可以使用世界座標系中的C1旋轉矩陣和世界座標系中的C1平移來形成P1和P2。然後使用相同的想法形成P2。這樣triangleluatePoints將在世界座標系中給出4D點。如果你想這樣,我可以提供一個答案,但我只用C++做過,但你會明白 – Thesane

回答

1

在下面的代碼,points4DNorm將包含3D點在世界座標。我根本沒有使用矯正,我只用了一些2d/3d點對,然後在這些對上解決了PnPRansac。

// rotMat1, rotMat2,tvec1 and tvec2 are retrieved from solvePnPRansac and Rodrigues 
     Mat points4D; 
     rotMat1.copyTo(myCam1.ProjectionMat(Rect(0, 0, 3, 3))); 
     tvec1.copyTo(myCam1.ProjectionMat(Rect(3, 0, 1, 3))); 

     rotMat2.copyTo(myCam2.ProjectionMat(Rect(0, 0, 3, 3))); 
     tvec2.copyTo(myCam2.ProjectionMat(Rect(3, 0, 1, 3))); 

     myCam1.ProjectionMat = myCam1.NewCameraMat* myCam1.ProjectionMat; 
     myCam2.ProjectionMat = myCam2.NewCameraMat* myCam2.ProjectionMat; 
     triangulatePoints(myCam1.ProjectionMat, myCam2.ProjectionMat, balls12d, balls22d, points4D); 
     Mat points4DNorm; 
     for (int k = 0; k < points4D.cols;k++) 
     { 
     points4D.at<float>(0, k) = (points4D.at<float>(0, k)/points4D.at<float>(3, k))/304.8; 
     points4D.at<float>(1, k) = (points4D.at<float>(1, k)/points4D.at<float>(3, k))/304.8; 
     points4D.at<float>(2, k) = (points4D.at<float>(2, k)/points4D.at<float>(3, k))/304.8; 
     points4D.at<float>(3, k) = (points4D.at<float>(3, k)/points4D.at<float>(3, k))/304.8; 
     std::cout << std::setprecision(9) << points4D.at<float>(0, k) << "," << points4D.at<float>(1, k) << "," << points4D.at<float>(2, k) << std::endl; 
     }