Perspective-n-Point (PnP) 问题:如下图, 1)给定 个3D参考点 到摄像机图像上2D投影点 的匹配点对; 2)已知 3D点在世界坐标系下的坐标,2D点在图像坐标系下的坐标; 3)已知摄像机的内参数 。 目的 :求世界坐标系与摄像机坐标系之间的位姿变换 用途:相机位姿跟踪,物体位姿跟踪,AR/VR,机器人操作,SLAM中位姿初值求解…… 常用解法 :DLT,P3P,EPnP,UPnP。
PnP问题示意图(OpenCV :https://docs.opencv.org/master/d9/d0c/group__calib3d.html#ga549c2075fac14829ff4a58bc931c033d)
1. DLT,直接线性变换
注意 :原版的DLT中无须已知摄像机内参(请参考 MVG ) 鉴于在大部分情况下,我们是已知摄像机内参的,因此这里的推导考虑了摄像机内参数。
1.1 理论推导
3D参考点在世界坐标系下的齐次坐标记为
c=xyz1
2D投影点在图像坐标系下的齐次坐标记为
u=uv1
相机的内参数为
K=fxfycxcy1
那么3D点到2D点投影可表示为
λuv1=fxfycxcy1[R∣t]xyz1 (1)
虽然
[R∣t]
有6个自由度, R 虽然有9个参数,但是只有3个自由度,因为旋转矩阵具有正交约束。在DLT算法中,首先忽略掉 R 的正交约束,按照[R∣t] 有12个未知参数 x=[a1,⋯,a12]T 计算,(1)式可变为
λ = uv1=fxfycxcy1a1a5a9a2a6a10a3a7a11a4a8a12xyz1 (2)
将(2)式展开
⎩⎨⎧λu=xfxa1+xcxa9+yfxa2+ycxa10+zfxa3+zcxa11+fxa4+cxa12λv=xfya5+xcya9+yfya6+ycya10+zfya7+zcya11+fya8+cya12λ=xa9+ya10+za11+a12 (3)
消掉 λ 可得
{xfxa1+xcxa9+yfxa2+ycxa10+zfxa3+zcxa11+fxa4+cxa12−uxa9−uya10−uza11−ua12=0xfya5+xcya9+yfya6+ycya10+zfya7+zcya11+fya8+cya12−vxa9−vya10−vza11−va12=0 (4)
写成矩阵形式
[xfx0yfx0zfx0fx00xfy0yfy0zfy0fyxcx−uxxcy−vxycx−uyycy−vyzcx−uzzcy−vzcx−ucy−v]a1a2⋮a12=0 (5)
有上述推导可知,1对3D-2D点对提供两个方程,即(5)式。当点对数 n≥6 时,产生一个方程
Ax=0 (6)
其中, A 的大小为 2n×12 。这个方程无法求出精确解,但是可以获得一个 ∣x∣=1 约束下的最小二乘解 argmin∣∣Ax∣∣2 (这部分可以参考:Ax=0求解以及MVG 教程)。具体的,对 A 进行SVD分解,可得
[U Σ V]=SVD(A) (7)
V 矩阵的最后一列 xˉ ,便为式(6)的解。注意,求解的结果是没有尺度的,也就是说实际的解为
x=βxˉ (8)
其中, β 为比例系数, xˉ=[aˉ1,⋯,aˉ12]T 。 旋转部分为
Rˉ = aˉ1aˉ4aˉ7aˉ2aˉ5aˉ8aˉ3aˉ6aˉ9
为带有尺度的正交矩阵,为求最优的旋转矩阵,将其进行SVD分解
[U Σ V]=SVD(Rˉ)
最优的旋转矩阵即为
R=±UVT
理论上, Σ 的对角线应该非常相近,取均值,求解得到比例系数为
β=±1/(tr(Σ)/3)
在加上一个限制条件,3D点应该在摄像机的前方
λ>0:β(xaˉ9+yaˉ10+zaˉ11+aˉ12)>0
可确定 β 和 R 的±符号。接着,可以求得平移向量
t=β[aˉ4,aˉ8,aˉ12]T (10)
1.2 工程实现&实验
1.2.1 实现
实现基于Eigen库完成,全部工程代码请见
https://github.com/ydsf16/PnP_Solver
1.2.2 实验
实验很暴力,直接把 DLT 方法塞进了ORB-SLAM2的前端,与Motion Only BA(MOB)的结果进行对比,结果如下图。MOB的轨迹明显更加平滑。在转角位置,由于跟踪到的点对较少,而且这些3D点较为集中,DLT出现了很明显的误差。另外,DLT也没有考虑外点、野值的问题,而MOB使用了Huber函数,因此MOB的解更稳定。(野值问题,之后可使用RANSAC解决)运行时间:200~300个点对的运行时间约为 0.07 ms。(Intel i7-8700, Ubuntu 16.04)。
轨迹对比
平移误差
旋转误差
参考资料
[1] 视觉SLAM十四讲
[2] Hartley R, Zisserman A. Multiple View Geometry in Computer Vision[M]. 2003.
[3] SVD分解
----- 未完待续, P3P, EPnP----
----更多SLAM文章----
杨小东:[ORB-SLAM2]卡方分布(Chi-squared)外点(outlier)剔除
杨小东:[ORB-SLAM2] ORB特征提取策略对ORB-SLAM2性能的影响
杨小东:[PR-3]ArUco EKF SLAM 扩展卡尔曼SLAM
杨小东:[PR-2] PF 粒子滤波/蒙特卡罗定位
----相关代码----
ydsf16 - Overview