2012-11-24 35 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,但您没有这样做。你在重复使用别人的代码吗?