相机姿势估计被反转

时间:2016-12-14 12:00:15

标签: c++ opencv

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

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

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

  4. 获得Pleft作为对角矩阵,并以R和t的结构为准。

  5. 以下是代码的重要部分:

    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)));
    

    结果是正确的。

    我错过了什么?

1 个答案:

答案 0 :(得分:1)

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