首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >摄像机姿态估计倒置

摄像机姿态估计倒置
EN

Stack Overflow用户
提问于 2016-12-14 12:00:15
回答 1查看 267关注 0票数 0

我正在研究一个结构,从运动框架,以生成三维模型的运动物体与固定相机。为了做到这一点,我遵循这条管道:

  1. 通过关键点得到基本矩阵F。由于我还在开发中,而且我还不能(还)访问我将要建模的最终对象,所以我使用一个小对象并在两个图像之间手动注释了关键点对:这些是用来计算F的对应关系,其中x‘是从右图像中的点,x是左图像的点(像素坐标),误差为0,1196。
  2. 用本征矩阵和基函数E = Kleft'*F*Kright求出了本质矩阵E,其中Kleft‘是左摄像机的逆内禀矩阵。利用SVD分解,我创建了一个新的E,它只有两个奇异值等于1。
  3. 分解E得到R和t。为此,我使用了一个自定义版本的OpenCV recoverPose()函数,它允许两个不同的相机矩阵。
  4. 得到了对角矩阵的Pleft和R和t的构造Pright。

以下是代码的重要部分:

代码语言:javascript
复制
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来可视化摄像机的姿势:

代码语言:javascript
复制
viz::Viz3d myWindow("Results");
viz::WCameraPosition cameraLeft(imgLeft->getIntrinsics().K,imgLeft->getImage());
viz::WCameraPosition cameraRight(imgRight->getIntrinsics().K,imgRight->getImage());

我在观看者中使用了Pleft和Pright:

代码语言:javascript
复制
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)));

然而,如果我这样做,结果是颠倒的。我不能嵌入多个链接,因为声誉很低,但camera1是相机2应该在的地方,反之亦然。

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

代码语言:javascript
复制
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)));

结果是正确的。

我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-12-22 10:58:35

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41142102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档