Opencv 如何计算两个摄像机之间的旋转和平移?

Opencv 如何计算两个摄像机之间的旋转和平移?,opencv,computer-vision,camera-calibration,Opencv,Computer Vision,Camera Calibration,我了解棋盘相机校准技术,并已实施该技术 如果我有两个摄像头观看同一场景,并且我使用棋盘技术同时校准了这两个摄像头,我可以计算它们之间的旋转矩阵和平移向量吗?怎么做?更新: 使用“运动/束调整”包中的“结构”可以同时求解场景的三维位置和相关摄影机参数 任何此类包都需要几个输入: 你的相机校准 摄像机中感兴趣点的2D像素位置(使用兴趣点检测,如Harris,DoG(SIFT的第一部分)) 每个摄像机感兴趣点之间的对应关系(使用诸如SIFT、SURF、SSD等描述符进行匹配) 请注意,该解决方案可达到

我了解棋盘相机校准技术,并已实施该技术


如果我有两个摄像头观看同一场景,并且我使用棋盘技术同时校准了这两个摄像头,我可以计算它们之间的旋转矩阵和平移向量吗?怎么做?

更新:

使用“运动/束调整”包中的“结构”可以同时求解场景的三维位置和相关摄影机参数

任何此类包都需要几个输入:

  • 你的相机校准
  • 摄像机中感兴趣点的2D像素位置(使用兴趣点检测,如Harris,DoG(SIFT的第一部分))
  • 每个摄像机感兴趣点之间的对应关系(使用诸如SIFT、SURF、SSD等描述符进行匹配)
  • 请注意,该解决方案可达到一定的模糊度。因此,需要在摄影机之间或场景中的一对对象之间提供距离测量

    原始答案(如评论所指出,主要适用于未校准的摄像头):

    加州理工学院提供的这项技术能够解决和可视化内在因素(镜头参数等)和外在因素(拍摄每张照片时相机的位置)。后者是你感兴趣的


    这也是一个很好的参考。特别是,你可能想看看关于极线和基本矩阵的章节,这在链接上是免费的。

    如果我理解正确,你有两个校准过的相机观察一个共同的场景,你希望恢复它们的空间排列。这是可能的(只要你找到足够的图像对应关系),但只能达到翻译规模上的未知因素。也就是说,我们可以恢复旋转(3个自由度,DOF),只恢复平移方向(2个DOF)。这是因为我们无法判断投影的场景是大而摄像机是远,还是小而摄像机是近。在文献中,5自由度排列被称为相对姿势或相对方向(谷歌是你的朋友)。 如果您的测量准确且处于一般位置,则6点对应可能足以恢复唯一的解决方案。确实如此

    Nister,D.,“五点相对位姿问题的有效解决方案”,模式分析和机器智能,IEEE学报,第26卷,第6期,第756770页,2004年6月
    doi:10.1109/TPAMI.2004.17

    如果您已经在使用OpenCV,那么为什么不使用
    cv::stereoCalibrate

    它返回旋转和平移矩阵。你要做的唯一一件事就是确保校准棋盘被两台摄像机看到

    具体方法如OpenCV库提供的.cpp示例所示(我有2.2版本,示例默认安装在/usr/local/share/OpenCV/samples中)


    代码示例称为stereou_calib.cpp。虽然没有清楚地解释他们在那里做什么(因为你可能想看看“学习OpenCV”),但这是你可以基于的东西。

    如果你有相应点的3D摄像机坐标,你可以通过计算最佳旋转矩阵和平移向量。

    注意Hartley和Zisserman的书,虽然这是一个很好的资料来源,但主要是关于未校准相机的几何结构,这在原始问题的范围内不太相关。只是插嘴,但这对我来说似乎很奇怪。如果您能够通过棋盘进行校准,如问题中所述,您是否不能获得摄像机之间的精确距离?如果你有相应的深度点,这个会发生什么变化?喂,你和Kinect一起工作?非常有趣的是,可能误解是因为我假设棋盘仅在相机校准过程中可见,而在估计相对方向时不可见。当然,如果你观察一些已知大小的物体,或者你知道任何像素的确切深度,那么缩放模糊度是可以解决的。Kinect是不同的,因为相机和投影仪之间的相对姿势是在工厂预先校准的。这是一种方式,因为我们显然有一种立体相机系统。即使有一个摄像头刚刚被平移和旋转到不同的位置,我们仍然可以模拟这样一个系统。当然,还有其他方法来计算摄像机的轨迹,比如通过主要的顶角来测量摄像机的平移(见互联网上同名论文)。