立体三角测量的奇怪问题:两个有效的解决方案

时间:2015-08-24 05:57:24

标签: opencv computer-vision triangulation pose-estimation

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

假设我有摄像机1和摄像机2,在X中间隔开,凸轮1位于(0,0,0),凸轮2位于右侧(正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. 
    
  3. 因此,与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规定的方式做到这一点:(海报点分散在太空中,看起来很奇怪)

    Wrong

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

    Correct

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

2 个答案:

答案 0 :(得分:1)

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

我发现当我使用不正确但直观的翻译向量(例如[1,0,0])时,除非我像你一样交换了points1和point2,否则我无法得到正确的结果。

我怀疑平移矢量实际上将点转换为另一个相机坐标系,而不是转换相机姿势的矢量。 OpenCV Documentation似乎意味着情况就是这样:

  

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

维基百科对Translation of Axis有一个很好的描述:

  

在新的坐标系中,点P似乎已在相反方向上平移。例如,如果xy系统向右平移距离h并向上平移距离k,则P似乎已经向左平移了距离h并且在x'y'系统中向下平移了距离k / p>

答案 1 :(得分:0)

此观察的原因在此线程中讨论 Is the recoverPose() function in OpenCV is left-handed?

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