我正在使用 OpenCV 的 solvePnPRansac 函数来估计我的相机的姿势,给定一个由跟踪特征组成的点云。我的管道由多个相机组成,我从两个相机之间的匹配特征形成点云,并使用它作为参考来估计其中一个相机开始移动时的姿势。我已经在多种设置中对此进行了测试,只要在相机运动时有足够的功能进行跟踪,它就可以工作。
奇怪的是,在我今天做的一个测试中,我遇到了一个失败的案例,solvePnP 会一直返回垃圾值。这里令人困惑的是,在这个数据集中,我的点云要密集得多,它从两个视图中重建得非常准确,在任何给定时间跟踪的点数(当前可见特征与点云中的特征)要高得多比我通常拥有的,所以理论上它应该是一件轻而易举的solvePnP,但它失败了。
我尝试了 CV_ITERATIVE、CV_EPNP 甚至是非 RANSAC 版本的solvePnP。我只是想知道我是否在这里遗漏了一些基本的东西?在这些图像中可以看到我正在看的场景(图像1是两个视角之间的场景和特征匹配,图像2是供参考的点云)
执行 PNP 的代码部分非常简单。如果 P3D 是跟踪的 3D 点数组,则 P2D 是相应的图像点集,
solvePnpRansac(P3D, P2D, K, d, R, T, false, 500, 2.0, 100, noArray(), CV_ITERATIVE);
编辑:我还应该提到,我的参考点云是在相机之间 8 英尺的基线处获得的,而我正在看的建筑物可能在 100 英尺之外。可能缺乏差异也会导致问题吗?