PnP (Perspective-n-Point)

**PnP(Perspective-n-Point,n 点透视)**问题:给定在已知地图(世界)坐标系中表示的 nn 个 3D 点 Xi\mathbf{X}_i、它们在相机图像中的 2D 投影 ui\mathbf{u}_i,以及内参矩阵 K\mathbf{K},估计满足下式的相机位姿 [Rt][R \mid \mathbf{t}]

λi[ui1]=K(RXi+t)\lambda_i \begin{bmatrix} \mathbf{u}_i \\ 1 \end{bmatrix} = \mathbf{K} \left( R \mathbf{X}_i + \mathbf{t} \right)

其中 λi\lambda_i 为某些正的深度值。PnP 是2D–3D 对应关系的主力方法:与基于 2D–2D 匹配的本质矩阵估计不同,它能够以**度量尺度(metric scale)**恢复平移,因为 3D 点本身已经携带了尺度信息。

主要求解方法

P3P(最小求解器)。 三组对应关系就足够了(位姿有 6 个自由度;每个 2D 点提供 2 个约束)。每一对图像射线之间夹角 θij\theta_{ij} 是已知的(由标定后的方向向量计算得到),余弦定理约束了未知的点深度 di=RXi+td_i = \lVert R\mathbf{X}_i + \mathbf{t} \rVert

di2+dj22didjcosθij=XiXj2d_i^2 + d_j^2 - 2 d_i d_j \cos\theta_{ij} = \lVert \mathbf{X}_i - \mathbf{X}_j \rVert^2

这三个方程可以化简为一个四次多项式,最多有 4 个实数解。第 4 组对应关系用于消除歧义。P3P 是 RANSAC 内部使用的最小求解器——较小的样本量能使所需的迭代次数保持在较低水平。

DLT(直接线性变换)。n6n \geq 6 组对应关系出发,线性求解 3×43 \times 4 的投影矩阵 PP(每个点给出 2 个齐次线性方程;将其堆叠起来,通过 SVD 求解 Ap=0A\mathbf{p} = 0)。然后通过分解 P=K[Rt]P = \mathbf{K}[R \mid \mathbf{t}](RQ 分解)提取位姿。方法简单,但在求解过程中忽略了已知的内参,且最小化的是代数误差(而非几何误差),因此精度不如专用求解器。

EPnP。 将所有 nn 个 3D 点表示为 4 个虚拟控制点的加权和:

Xi=j=14αijcj,jαij=1\mathbf{X}_i = \sum_{j=1}^{4} \alpha_{ij} \mathbf{c}_j, \qquad \sum_j \alpha_{ij} = 1

重心权重 αij\alpha_{ij} 对刚体变换是不变的,因此问题被简化为在相机坐标系中估计控制点的 12 个坐标,与 nn 的大小无关。复杂度为 O(n)O(n),这使得 EPnP 成为处理大规模对应集合(例如重定位)的标准非最小求解器。

迭代精化。 无论初始位姿由哪种求解器给出,最终答案都通过最小化总的重投影误差加以精化

minR,tiuiπ ⁣(K,RXi+t)2\min_{R, \mathbf{t}} \sum_i \left\lVert \mathbf{u}_i - \pi\!\left(\mathbf{K}, R\mathbf{X}_i + \mathbf{t}\right) \right\rVert^2

使用高斯-牛顿或列文伯格-马夸尔特方法(这正是带迭代标志的 cv::solvePnP 以及 ORB-SLAM 中的”仅运动光束法平差(motion-only bundle adjustment)“所做的事情)。

鲁棒估计

真实的 2D–3D 匹配集合中包含外点(错误的描述子匹配、被移动的物体)。标准流程是P3P + RANSAC:采样 3 组对应关系,求解 P3P,按重投影误差阈值(几个像素)统计内点数量,保留最佳模型,然后用 M 估计器或普通最小二乘对所有内点进行精化。

对SLAM的意义

动手实践

相关条目