简介
PnP(Perspective-n-Point)描述了当我们已知n个世界坐标系下的3D空间点以及它们的2D归一化相机坐标系下的坐标时,如何估计相机位姿的方法。通常最少需要4对3D-2D点对(其中之一用于验证结果),就可以解出PnP问题。尤其是在双目或RGB-D的视觉里程计中,点的空间坐标可以由 s K − 1 x sK^{-1}x sK−1x直接求出, s s s为像素点的深度值,即可直接使用PnP估计相机运动。
PnP问题解法有很多,线性方法有直接线性变换法、P3P、EPnP、UPnP等,还可以采用非线性优化的方法、构建最小二乘问题迭代求解,最常用的是BA调整(Bundle Adjustment)。OpenCV中对上述多数方法都进行了集成,详情可见:solvePnP()。
PnP只是求解相机位姿的方法,求解出来的位姿均是相机相对世界坐标系的变换关系 T w c T_{wc} Twc。对于那些没有3D匹配点的2D-2D匹配点对,估计其对应的3D点仍需采用三角化方式。
原理
直接线性变换法
直接线性变换法依据相机投影的基本原理,通过线性变换求解目标值。即 s x = P X sx=PX sx=PX其中, x = ( u , v , 1 ) T x=(u,v,1)^T x=(u,v,1)T为像素点的归一化坐标; P = [ R ∣ T ] P=[R|T] P=[R∣T]为 3 × 4 3\times4 3×4的相机投影矩阵。
在求解PnP问题时,旋转矩阵 R R R和平移矩阵 T T T是待求的变量,由于 P P P一共有12维,而每对点对能提供2个约束,因此最少需要6对点对,才能实现PnP问题的线性求解。
需要注意的一点是,上述公式默认相机内参数矩阵 K K K已知,所以 x x x采用的是归一化平面坐标,在求解PnP问题时去掉了 K K K的影响,对应的solvePnP()中的3D点为相机坐标系下的齐次坐标;如果 K K