4

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

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

所以问题是:

  • 是否有没有依赖关系并使用允许商业使用的许可证的捆绑调节器?
  • 还有其他简单的方法可以找到外在因素吗?
  • 与相机距离非常不同的物体是否有问题?(大视差)

提前致谢

4

2 回答 2

1

我也在解决同样的问题并面临更棘手的问题。这里有一些建议——

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

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

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

于 2012-12-03T02:10:48.053 回答
0

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

于 2014-02-24T06:20:49.400 回答