2012-11-24 70 views
4

我處於需要根據圖像對應關係找出兩個或多個相機之間的相對位置(所以相機不在同一個點)的情況。爲了解決這個問題,我嘗試了與here(代碼如下)中描述的相同的方法。尋找相機之間的extrinsics

cv::Mat calibration_1 = ...; 
cv::Mat calibration_2 = ...; 
cv::Mat calibration_target = calibration_1; 
calibration_target.at<float>(0, 2) = 0.5f * frame_width; // principal point 
calibration_target.at<float>(1, 2) = 0.5f * frame_height; // principal point 

auto fundamental_matrix = cv::findFundamentalMat(left_matches, right_matches, CV_RANSAC); 
fundamental_matrix.convertTo(fundamental_matrix, CV_32F); 
cv::Mat essential_matrix = calibration_2.t() * fundamental_matrix * calibration_1; 
cv::SVD svd(essential_matrix); 
cv::Matx33f w(0,-1,0, 
    1,0,0, 
    0,0,1); 
cv::Matx33f w_inv(0,1,0, 
    -1,0,0, 
    0,0,1); 
cv::Mat rotation_between_cameras = svd.u * cv::Mat(w) * svd.vt; //HZ 9.19 

但在我的大多數情況下,我得到極其奇怪的結果。所以我的下一個想法是使用一個完整的捆綁調整器(應該做我想找的?!)。目前我唯一的大依賴是OpenCV,他們只有一個無證的捆綁調整實現。

所以,問題是:

  • 有它沒有依賴關係,並使用許可證,允許商用使用束調節?
  • 有沒有其他簡單的方法來找到extrinsics?
  • 距離攝像機距離很遠的物體是否有問題? (重視差)

在此先感謝

+0

你能提供更多的細節嗎?請問,這兩款相機都有一個共同的視場(FOV)? –

+0

相機是相同的型號 - 但不完全相同 - 因此內在因素可能會稍有不同。理想情況下,內部調整也得到調整,但目前這不是我的優先 – Daniel

+0

我的問題是兩臺相機是否有可以成像的公共區域。如果是的話,你可以在該公共區域放置一個棋盤,並找出相機之間的相對位置。 –

回答

1

我也正在同樣的問題和麪臨的問題slimier。 這裏有一些建議 -

  1. 修改基本矩陣分解之前: 分解之前修改基本矩陣[UW的Vt] = SVD(E),和新的E」 = DIAG(S,S,0),其中s = W(0,0)+ W(1,1)/ 2

  2. 2級基本矩陣估算: 重新計算基本矩陣與RANSAC內圍層

這些步驟應使旋轉估計更多易受噪音影響。

+0

嘿感謝您的答案,你能解釋第一步,更詳細一點嗎? – Daniel

0

您必須得到4種不同的解決方案,並選擇具有正Z座標的#點最多的解決方案。解決方案是通過反轉基本矩陣的符號來生成的,用w_inv代替w,雖然您計算了w_inv,但您沒有這樣做。你在重複使用別人的代碼嗎?