透视N点解:位置随旋转角度线性漂移?

Perspective N point solution: Position drifting linearly with rotation angles?

我正在使用 P3P 算法来计算给定预映射 3D 点的相机的旋转和平移,以及它们在 2D 平面上的相应投影(PNP 问题)。我使用的算法是 CVPR 2017 paper 中描述的算法,在 OpenCV 和 OpenMVG 中都有实现(我正在使用后者)。当然,该算法在 RANSAC 框架内运行。

奇怪的是,我注意到计算出的位置有一个精确的 'drift',它随旋转角度而变化。即:如果我保持相机的位置不变并只是旋转它,根据 OpenCV 坐标约定,俯仰的变化导致位置在 Y 方向上漂移,偏航的变化导致位置在 X 方向上漂移(我有尚未测试滚动。)当我尝试将曲线拟合到这个俯仰与 Y 和偏航与 X 值的数据集时,我注意到一个非常恒定的变化。去除比例因子并将角度转换为弧度后,这是我看到的配置文件:

X ~= -4.0 * yaw_angle
Y ~= 4.0 * pitch_angle

(平移单位为米,比例因子为 1.0,旋转角度为弧度)

这是我没有考虑到的某种众所周知的转换吗?它是线性的,所以我假设它不能依赖于旋转角度。我浏览了这篇论文和一些相关资源,但我无法弄清楚这种关系的原因。

来自 MATLAB 的曲线拟合结果:

问题出在我的代码中,我直接访问了解决方案的翻译部分,而不是相机位置,因此确实缺少转换。

为了将来参考,PNP 解决方案的真实相机位置需要计算为

C = -R' * t

R是旋转矩阵,t是PNP算法返回的最终平移向量。作为一个线性算子,它编码了一个关于旋转角度的纯线性关系。