我目前正在使用OpenCV进行与姿势估计相关的工作,其中我正在对用于重建和比例因子估计的对之间进行三角测量。我在处理这个问题时遇到了一个奇怪的问题,特别是在opencv函数recoverPose()和triangulatePoints()中。
假设我有摄像机1和摄像机2,在X中间隔开,凸轮1位于(0,0,0),凸轮2位于右侧(正X)。我有两个数组points1和points2,它们是两个图像之间的匹配特征。根据OpenCV文档和代码,我注意到两点:
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规定的方式做到这一点:(海报点分散在太空中,看起来很奇怪)
如果我这样做(错误?)方式:
有人可以分享他们对这里发生的事情的看法吗?从技术上讲,这两种解决方案都是有效的,因为所有点都落在两个摄像头前:我不知道要选择什么,直到我把它渲染成一个点云。我做错了什么,或者是文档中的错误?我对计算机视觉理论知之甚少,所以我可能会遗漏一些基本的东西。谢谢你的时间!
答案 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的向量。