PnP
算法是指已知3D点及其在相机上的投影,求相机姿态的问题。
投影方程可以表示为:
λ
[
u
v
1
]
=
K
[
R
t
]
[
x
y
z
1
]
\lambda \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K \begin{bmatrix} R & t \end{bmatrix}\begin{bmatrix} x \\ y \\ z\\1 \end{bmatrix}
λ
⎣
⎡
u
v
1
⎦
⎤
=
K
[
R
t
]
⎣
⎢
⎢
⎡
x
y
z
1
⎦
⎥
⎥
⎤
这里的
K
为相机内参矩阵,是已知的。我们要做的就是从
n
对这样的对应关系中恢复出相机姿态。在SLAM应用中,系统初始化后,后面的跟踪就是基于求解
PnP
问题。
1、求解
PnP
问题的
DLT
解法
首先,将
[
R
t
]
\begin{bmatrix} R & t \end{bmatrix}
[
R
t
]
看作是一个包含12个未知量的
3x4
矩阵,而将投影方程消去尺度因子
λ
\lambda
λ
后,可以获得两个方程,在联立不少于6个的投影方程后,即可求出12个未知量的最小二乘解,最后恢复出
[
R
t
]
\begin{bmatrix} R & t \end{bmatrix}
[
R
t
]
。
2、求解
PnP
问题的
EPnP
解法
它的思路是先将世界坐标系下的三维点转换到相机坐标系下,再用
icp
的方式得到相机位姿。但是,如何在位姿未知的情况下转换?这里引入了控制点的概念,所有的三维点都可以由四个控制点表示,在世界坐标系和相机坐标系下只有基底的变化,系数是相同的。而这就要求获得控制点在相机坐标系下的坐标,这里同样利用的是投影方程联立求解。
以上具体推到过程参考:
https://zhuanlan.zhihu.com/p/58648937
https://zhuanlan.zhihu.com/p/59070440