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

vag*_*ran 5 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);
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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

x2 = R * x1 + t

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