【问题标题】:Camera pose estimation is inverted相机姿态估计是倒置的
【发布时间】:2016-12-14 12:00:15
【问题描述】:

我正在开发一个 Structure from Motion 框架,用于生成带有固定摄像头的移动物体的 3D 模型。为此,我正在关注这条管道:

  1. 通过关键点获得基本矩阵F。由于我仍处于开发阶段,我无法(还)访问我将建模的最终对象,我正在使用一个小对象并在两个图像之间手动注释关键点对: These 是用于计算 F 的对应关系。通过 x'Fx 计算 F 的误差,其中 x' 是来自右侧图像的点,x 是左侧图像的点(以像素坐标表示)给出的误差为 0,1196 .
  2. 使用内部矩阵和基本矩阵计算基本矩阵 E:E = Kleft'*F*Kright 其中 Kleft' 是左侧相机的逆内部矩阵。通过 SVD 分解,我创建了一个新的 E,它只有两个等于 1 的奇异值。

  3. 分解 E 得到 R 和 t。为此,我使用了 OpenCV recoverPose() 函数的自制自定义版本,它允许使用两个不同的相机矩阵。

  4. 将 Pleft 作为对角矩阵,将 Pright 作为 R 和 t 的构造。

以下是代码的重要部分:

F = findFundamentalMat( alignedLeft.points, alignedRight.points, mask, RANSAC);
E = cameraMatrixLeftInv*F*cameraMatrixRight;
SVD::compute(E, w, u, vt);

Mat diag = Mat::zeros(Size(3,3),6);
diag.at<double>(0,0) = 1;
diag.at<double>(1,1) = 1;       
E = u*diag*vt;
int good = recoverPoseFromTwoCameras(E,alignedLeft.points,alignedRight.points,intrinsicsLeft.K,intrinsicsRight.K,R,t,mask);
Pleft = Matx34f::eye();
Pright = Matx34f(R.at<double>(0,0), R.at<double>(0,1), R.at<double>(0,2), t.at<double>(0),
                 R.at<double>(1,0), R.at<double>(1,1), R.at<double>(1,2), t.at<double>(1),
                 R.at<double>(2,0), R.at<double>(2,1), R.at<double>(2,2), t.at<double>(2));

然后我使用 viz 来可视化相机姿势:

viz::Viz3d myWindow("Results");
viz::WCameraPosition cameraLeft(imgLeft->getIntrinsics().K,imgLeft->getImage());
viz::WCameraPosition cameraRight(imgRight->getIntrinsics().K,imgRight->getImage());

我使用 Pleft 和 Pright 将其放置在查看器中:

myWindow.showWidget("cameraLeft",cameraLeft,Affine3d(Pleft(Range::all(),Range(0,3)),Pleft.col(3)));
myWindow.showWidget("cameraRight",cameraRight,Affine3d(Pright(Range::all(),Range(0,3)),Pright.col(3)));

但是,如果我这样做,结果就会反转。由于声誉低,我不能嵌入多个链接,但相机 1 应该是相机 2 的位置,反之亦然。

但如果我像这样应用矩阵:

myWindow.showWidget("cameraLeft",cameraLeft,Affine3d(Pright(Range::all(),Range(0,3)),Pleft.col(3)));
myWindow.showWidget("cameraRight",cameraRight,Affine3d(Pleft(Range::all(),Range(0,3)),Pleft.col(3)));

结果是正确的。

我错过了什么?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    希望你已经解决了!如果没有,最好上传更多数据。例如,特征、您计算的 F/E、相机固有特性。然后我们可以测试你的代码并尝试找到你的错误,否则,有很多可能的。

    【讨论】:

    • 我还没有,但我已经着手重建这些点,因为初步结果给出了一个很好的结构。由于最终项目将依靠光流(而不是特征匹配)来获得基本矩阵,因此我正在推进重建/网格生成/纹理映射。如果我找到解决方案,我会更新这篇文章,但我相信这是由于对所涉及的 openCV 函数/代数的误解造成的。
    猜你喜欢
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 2013-02-15
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多