我目前正在使用 OpenCV 进行与姿势估计相关的工作,其中我正在对对之间的点进行三角测量以进行重建和比例因子估计。我在处理这个问题时遇到了一个奇怪的问题,尤其是在 opencv 函数recoverPose() 和 triangulatePoints() 中。
假设我有摄像头 1 和摄像头 2,它们在 X 中间隔开,cam1 在 (0,0,0) 处,cam2 在它的右侧(正 X)。我有两个数组 points1 和 points2 是两个图像之间的匹配特征。根据 OpenCV 文档和代码,我注意到了两点:
- recoverPose() 假设 points1 属于 (0,0,0) 处的相机。
triangulatePoints() 被调用了两次:一次来自 recoverPose(),告诉我们四种 R/t 组合中的哪一种是有效的,然后再次从我的代码中调用,文档说:
cv::triangulatePoints(P1, P2, points1, points2, points3D) : points1 -> P1 and points2 -> P2.
因此,与recoverPose() 的情况一样,可以安全地假设P1 是[I|0] 而P2 是[R|t]。
我实际发现的是:它不是那样工作的。虽然我的 camera1 为 0,0,0 而 camera2 为 1,0,0(1 符合比例),但如果我运行,则获得唯一正确的配置
recoverPose(E, points2, points1...)
triangulatePoints([I|0], [R|t], points2, points1, pts3D)
这应该是不正确的,因为 points2 是 R|t 的集合,而不是 points1。我在房间里测试了一个场景的图像对,其中在三角测量后有三个明显的物体:一个监视器和它后面墙上的两张海报。这是三角测量产生的点云(请原谅 MS Paint)
如果我按照 OpenCV 规定的方式进行操作:(海报点分散在空间中,看起来很奇怪)
如果我这样做(错误?)方式:
任何人都可以分享他们对这里发生的事情的看法吗?从技术上讲,这两种解决方案都是有效的,因为所有点都落在两个摄像头的前面:而且我不知道要选择什么,直到我将它渲染为点云。我做错了什么,还是文档中的错误?我对计算机视觉理论不是很了解,所以我可能在这里遗漏了一些基本的东西。谢谢你的时间!