OpenCV中的recoverPose()函数是否是左手坐标系?

7

我进行了一项与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轴向下)形成了左手坐标系。这是真的吗?为什么这个结果与这里所示的坐标系不同?
3个回答

9
根据OpenCV的文档,函数recoverPose中的算法基于论文"Nistér, D. An efficient solution to the five-point relative pose problem, CVPR 2003."。从此论文第2节的公式中可以看出,它使用基本的三角形关系(见这里图): x2 = R*x1 + t
因此,翻译t是从相机2到相机1在相机2坐标系下的向量。这就解释了为什么你会得到接近[0;0;-1]的答案。

1
所以,如果我想要获取“正确”的tR,我应该:1)反转齐次矩阵E,然后2)使用recoverPose()函数? - dexter2406

2

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


1
在这个图表中

diagram

原点位于右上角。因此,它符合右手坐标系。图像和相机坐标系的正Z轴方向相同。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接