OpenCV中的recoverPose()函数是左撇子吗?

时间:2016-06-14 11:04:50

标签: c++ opencv computer-vision pose-estimation structure-from-motion

我对OpenCV相机姿态估计进行简单测试。将照片和相同的照片放大(放大)后,我会使用它们来检测特征,计算基本矩阵并恢复相机姿势。

Mat inliers;
Mat E = findEssentialMat(queryPoints, trainPoints, cameraMatrix1, cameraMatrix2,
                         FM_RANSAC, 0.9, MAX_PIXEL_OFFSET, inliers);

size_t inliersCount =
    recoverPose(E, queryGoodPoints, trainGoodPoints, cameraMatrix1, cameraMatrix2, R, T, inliers);

因此,当我将原始图像指定为第一个,并将缩放图像指定为第二个时,我得到平移T接近[0; 0; -1]。然而,第二个相机(缩放)实际上比第一个更接近物体。因此,如果Z轴从图像平面进入场景,则第二个摄像机应沿Z轴具有正偏移。对于我得到的结果,Z轴从图像平面朝向摄像机,其中与其他轴(X向右,Y向下)形成左手坐标系。真的吗?为什么这个结果与图示的坐标系here不同?

3 个答案:

答案 0 :(得分:5)

根据OpenCV document,函数recoverPose中的算法基于论文“Nistér,D。五点相对姿势问题的有效解决方案,CVPR 2003”。从本文第2节中的方程式,我们知道它使用基本三角关系(见图here):

x2 = R * x1 + t

因此,平移t是cam2帧中从cam2到cam1的向量。这就解释了为什么你得到的答案接近[0; 0; -1]。

答案 1 :(得分:1)

似乎recoverPose()函数返回第一个相对于第二个相机变换(这对我来说不直观,并且在文档中没有明确说明)。通过此假设测试正常工作。

答案 2 :(得分:1)

在此图中

diagram

来源位于右上角。因此,它满足右手坐标系。图像和相机坐标系的正Z轴位于同一方向。

但是,在openCV中,图像坐标系位于左上角。因此,它满足左手坐标系。图像和相机坐标系的正Z轴位于相反方向。