我正在使用OpenCV的solvePnPRansac函数来估计我的相机的姿势,给定由跟踪功能制作的pointcloud。我的管道由多个摄像机组成,我从两个摄像机之间的匹配功能形成点云,并使用它作为参考来估计其中一个摄像机开始移动时的姿势。我已经在多种设置中对其进行了测试,只要在摄像机处于运动状态时有足够的功能可以跟踪,它就能正常工作。
奇怪的是,在我今天做的测试中,我遇到了一个失败的情况,其中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英尺远。可能缺乏差异会导致问题吗?