4

我目前正在使用 OpenCV 进行与姿势估计相关的工作,其中我正在对对之间的点进行三角测量以进行重建和比例因子估计。我在处理这个问题时遇到了一个奇怪的问题,尤其是在 opencv 函数recoverPose() 和 triangulatePoints() 中。

假设我有摄像头 1 和摄像头 2,它们在 X 中间隔开,cam1 在 (0,0,0) 处,cam2 在它的右侧(正 X)。我有两个数组 points1 和 points2 是两个图像之间的匹配特征。根据 OpenCV 文档和代码,我注意到了两点:

  1. recoverPose() 假设 points1 属于 (0,0,0) 处的相机。
  2. 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 规定的方式进行操作:(海报点分散在空间中,看起来很奇怪)

错误的

如果我这样做(错误?)方式:

正确的

任何人都可以分享他们对这里发生的事情的看法吗?从技术上讲,这两种解决方案都是有效的,因为所有点都落在两个摄像头的前面:而且我不知道要选择什么,直到我将它渲染为点云。我做错了什么,还是文档中的错误?我对计算机视觉理论不是很了解,所以我可能在这里遗漏了一些基本的东西。谢谢你的时间!

4

2 回答 2

1

我遇到了类似的问题。我相信 OpenCV 以与预期相反的方式定义翻译向量。使用您的相机配置,平移向量将为 [-1, 0, 0]。这是反直觉的,但 RecoverPose 和 stereoCalibrate 都给出了这个平移向量。

我发现当我使用不正确但直观的平移向量(例如 [1, 0, 0])时,除非像您一样交换点 1 和点 2,否则无法获得正确的结果。

我怀疑平移向量实际上是将点转换到另一个相机坐标系,而不是转换相机姿势的向量。OpenCV Documentation似乎暗示了这种情况:

联合旋转平移矩阵 [R|t] 称为外参数矩阵。它用于描述静态场景周围的摄像机运动,反之亦然,描述静止摄像机前物体的刚性运动。也就是说,[R|t] 将点 (X,Y,Z) 的坐标转换为相对于相机固定的坐标系 。

维基百科对 Axis的翻译有一个很好的描述:

在新的坐标系中,点 P 似乎已沿相反方向平移。例如,如果 xy 系统向右平移距离 h 并向上平移距离 k,则在 x'y' 系统中 P 将看起来向左平移距离 h 并向下平移距离 k

于 2016-03-25T04:04:01.823 回答
0

此线程中讨论了这种观察的原因 OpenCV 中的 recoverPose() 函数是左撇子吗?

平移 t 是 cam2 帧中从 cam2 到 cam1 的向量。

于 2020-04-18T07:21:12.790 回答