整理自浙江大学谭平老师的课堂内容
问题引出
PNP问题是指在已知相机内参的前提下,通过N对匹配的图像坐标以及它们的世界坐标计算相机的位姿。是一个3D-2D问题。
关于n的探讨
图像上一个点会对相机位姿产生两个约束,如下图所示,点
x
i
x_i
xi的存在会使得相机平面不能沿垂直
X
i
x
i
X_ix_i
Xixi的平面做平移运动,损失2个自由度。 相机位姿变化T含有6个自由度,所以至少需要在两幅图像中有3对点对,才能进行计算。即
n
≥
3
n \ge 3
n≥3。
PNP问题的求解思路
- 计算出特征点在相机坐标系下的三维坐标
- 通过特征点在世界坐标系和相机坐标系里面的位置关系求解相机姿态
P3P
通过图像坐标求解在相机坐标系下的三维坐标
对于两对点对
X
i
x
i
X_ix_i
Xixi和
X
j
x
j
X_jx_j
Xjxj利用余弦定理,有
d
i
j
2
=
d
i
2
+
d
j
2
−
2
d
i
d
j
cos
θ
i
j
d_{i j}^{2}=d_{i}^{2}+d_{j}^{2}-2 d_{i} d_{j} \cos \theta_{i j}
dij2=di2+dj2−2didjcosθij
记
f
i
j
(
d
i
,
d
j
)
=
d
i
2
+
d
j
2
−
2
d
i
d
j
cos
θ
i
j
−
d
i
j
2
f_{i j}\left(d_{i}, d_{j}\right)=d_{i}^{2}+d_{j}^{2}-2 d_{i} d_{j} \cos \theta_{i j}-d_{i j}^{2}
fij(di,dj)=di2+dj2−2didjcosθij−dij2
其中
d
i
j
,
θ
i
j
d_{ij},\theta_{ij}
dij,θij为已知量,
d
j
,
d
j
d_j,d_j
dj,dj为未知量。其中两点与图像上两点与相机光心夹角的余弦值可以借助相机内参矩阵得出:
cos
θ
=
y
1
T
y
2
(
y
1
T
y
1
)
(
y
2
T
y
2
)
=
x
1
T
(
K
−
T
K
−
1
)
x
2
(
x
1
T
(
K
−
T
K
−
1
)
x
1
)
(
x
2
T
(
K
−
T
K
−
1
)
x
2
)
\cos \theta=\frac{ y _{1}^{T} y_{2}}{\sqrt{\left( y _{1} T y _{1}\right)\left( y _{2} T y _{2}\right)}}=\frac{ x _{1} T \left( K ^{- T } K ^{-1}\right) x _{2}}{\sqrt{\left( x _{1} T \left( K ^{- T } K ^{-1}\right) x _{1}\right)\left( x _{2} T \left( K ^{- T } K ^{-1}\right) x _{2}\right)}}
cosθ=(y1Ty1)(y2Ty2)y1Ty2=(x1T(K−TK−1)x1)(x2T(K−TK−1)x2)x1T(K−TK−1)x2
当我们由3个点时,可以构造3个方程
{
f
12
(
d
1
,
d
2
)
=
0
f
23
(
d
2
,
d
3
)
=
0
f
13
(
d
1
,
d
3
)
=
0
\left\{\begin{array}{l} f_{12}\left(d_{1}, d_{2}\right)=0 \\ f_{23}\left(d_{2}, d_{3}\right)=0 \\ f_{13}\left(d_{1}, d_{3}\right)=0 \end{array}\right.
⎩⎨⎧f12(d1,d2)=0f23(d2,d3)=0f13(d1,d3)=0
通过消元,可以将方程组变为一元四次方程,令
x
=
d
1
2
x=d_1^2
x=d12
g
(
x
)
=
a
5
x
4
+
a
4
x
3
+
a
3
x
2
+
a
2
x
+
a
1
=
0
g(x)=a_{5} x^{4}+a_{4} x^{3}+a_{3} x^{2}+a_{2} x+a_{1}=0
g(x)=a5x4+a4x3+a3x2+a2x+a1=0
求解这个方程,我们会得到4个解,这其中只有一个是我们需要的解。也就是说对于P3P问题,虽然只要3个点就可以进行求解,但是通常需要第四个点对结果进行检验。
求解出
d
1
,
d
2
,
d
3
d_1,d_2,d_3
d1,d2,d3,相当于获得了点在图像中的深度信息,也就求出了点在相机坐标系下的坐标。
线性PNP算法
对于
n
≥
5
n\ge 5
n≥5的情况,对于任意一个点和两个其它点,可以构建一个方程
g
(
x
)
=
a
5
x
4
+
a
4
x
3
+
a
3
x
2
+
a
2
x
+
a
1
=
0
g(x)=a_{5} x^{4}+a_{4} x^{3}+a_{3} x^{2}+a_{2} x+a_{1}=0
g(x)=a5x4+a4x3+a3x2+a2x+a1=0
一系列这样的方程可以构建一个线性方程组,
(
.
.
.
a
5
i
a
4
i
a
3
i
a
2
i
a
1
i
.
.
.
)
(
x
4
x
3
x
2
x
1
)
=
0
\left(\begin{array}{ccccc} ... \\a_{5}^{i} & a_{4}^{i} & a_{3}^{i} & a_{2}^{i} & a_{1}^{i}\\ ... \end{array}\right)\left(\begin{array}{c} x^{4} \\ x^{3} \\ x^{2} \\ x \\ 1 \end{array}\right)=0
⎝⎛...a5i...a4ia3ia2ia1i⎠⎞⎝⎜⎜⎜⎜⎛x4x3x2x1⎠⎟⎟⎟⎟⎞=0
EPNP
Linear PNP算法的复杂度是 O ( n 5 ) O(n^5) O(n5),EPNP算法复杂度是 O ( n ) O(n) O(n)。