6

我对 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 向下)形成左手坐标系。真的吗?为什么此结果与此处说明的坐标系不同?

4

3 回答 3

8

根据 OpenCV文档,recoverPose 函数中的算法基于论文“Nistér, D. An Effective solution to the 五点相对位姿问题,CVPR 2003”。从本文第 2 节中的方程,我们知道它使用了基本的三角形关系(参见此处的图):

x2 = R*x1 + t

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

于 2017-08-16T21:01:22.237 回答
2

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

于 2016-06-14T13:52:21.287 回答
1

在这张图中

图表

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

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

于 2020-04-18T06:15:58.763 回答