在相机之间寻找外在的东西

时间:2012-11-24 15:26:29

标签: c++ opencv computer-vision bundler levenberg-marquardt

我正处于需要根据图像对应关系找到两个/多个摄像机之间的相对摄像头姿势的情况(因此摄像机不在同一点)。为了解决这个问题,我尝试了与here所述相同的方法(下面的代码)。

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,他们只有一个未记录的捆绑调整实现。

所以问题是:

  • 是否有捆绑调整器没有依赖关系,并使用允许商业使用的许可证?
  • 还有其他简单的方法可以找到外在词吗?
  • 与相机的距离差异很大的物体是否有问题? (重视差)

提前致谢

2 个答案:

答案 0 :(得分:1)

我也在研究同样的问题并面临更为棘手的问题。 以下是一些建议 -

  1. 分解前修改基本矩阵: 在分解之前修改基本矩阵[UW Vt] = SVD(E),并且新E'= diag(s,s,0)其中s = W(0,0)+ W(1,1)/ 2

  2. 2阶段基本矩阵估计: 使用RANSAC inlier重新计算基本矩阵

  3. 这些步骤应使旋转估计更容易受到噪声的影响。

答案 1 :(得分:0)

您必须获得4种不同的解决方案,并选择具有最多#点且具有正Z坐标的解决方案。解决方案是通过反转基本矩阵的符号生成的,用w_inv代替w,尽管你计算了w_inv,但你没有这样做。您是否在重复使用别人的代码?