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

Is the recoverPose() function in OpenCV is left-handed?

I 运行 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?

似乎 recoverPose() 函数 returns 第一个相机相对于第二个相机变换(这对我来说不直观,文档中也没有明确说明)。有了这个假设测试工作正常。

根据 OpenCV document, the algorithm in the function recoverPose is based on the paper "Nistér, D. An efficient solution to the five-point relative pose problem, CVPR 2003." From equations in Section 2 in this paper, we know it uses the basic triangle relationship (see figure here):

x2 = R*x1 + t

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

在这张图中

原点位于右上角。故满足右手坐标系。图像和相机坐标系的正 Z 轴方向相同。

然而,在openCV中,图像坐标系位于左上角。所以,它满足左手坐标系。图像和相机坐标系的正Z轴方向相反。