Perspective-n-Point 是求解3D到2D点对运动的方法。它描述了已知n个3D空间点及其投影位置时,如何估计相机的位姿。
2D-2D的对极几何方法需要8个或8个以上的点对(以八点法为例),且存在初始化、纯旋转和尺度的问题。然而,如果两张图像中的特征点的3D位置已知,那么最少只需3个点对(以及至少一个额外点验证结果)就可以估计相机运动。
直接线性变换
已知一组3D点的位置,以及它们在某个相机中的投影位置,求该相机的位姿。这个问题也可以用于求解给定地图和图像时的相机状态问题。如果把3D点看成在另一个相机坐标系的点的话,也可以用来求解两个相机的相对运动问题,如果把3D点看做目标物体自身坐标系中的点的话,也可以用来求解目标物体相对相机的位姿。
考虑某个空间点
P
P
P,它的齐次坐标为
P
=
(
X
,
Y
,
Z
,
1
)
T
\bm{P}=(X,Y,Z,1)^T
P=(X,Y,Z,1)T。在图像
I
1
I_1
I1中,投影到特征点
x
1
=
(
x
1
,
y
1
,
1
)
T
\bm{x}_1=( {x}_1, {y}_1,1)^T
x1=(x1,y1,1)T(以归一化平面齐次坐标表示)。此时,相机的位姿
R
,
t
\bm{R},\bm{t}
R,t是未知的。与单应矩阵的求解类似,我们定义增广矩阵
[
R
t
]
\begin{array}{l|l}[\bm{R}&\bm{t}]\end{array}
[Rt]为一个
3
×
4
3\times4
3×4的矩阵,包含了旋转与平移信息。
s
(
x
1
y
1
1
)
=
[
R
t
]
P
=
(
t
1
t
2
t
3
t
4
t
5
t
6
t
7
t
8
t
9
t
10
t
11
t
12
)
(
X
Y
Z
1
)
s\begin{pmatrix} {x}_1\\ {y}_1\\1\end{pmatrix}=\begin{array}{l|l}[\bm{R}&\bm{t}]\bm{P}\end{array} =\begin{pmatrix}t_1&t_2&t_3&t_4\\t_5&t_6&t_7&t_8\\t_9&t_{10}&t_{11}&t_{12}\end{pmatrix} \begin{pmatrix} X\\Y\\Z\\1 \end{pmatrix}
s
x1y11
=[Rt]P=
t1t5t9t2t6t10t3t7t11t4t8t12
XYZ1
用最后一行把
s
s
s消去,得到两个约束:
u
1
=
t
1
X
+
t
2
Y
+
t
3
Z
+
t
4
t
9
X
+
t
10
Y
+
t
11
Z
+
t
12
v
1
=
t
5
X
+
t
6
Y
+
t
7
Z
+
t
8
t
9
X
+
t
10
Y
+
t
11
Z
+
t
12
u_1=\dfrac{t_1 X+t_2 Y+t_3 Z +t_4}{t_9X+t_{10}Y+t_{11}Z+t_{12}}\\ v_1=\dfrac{t_5 X+t_6 Y+t_7 Z +t_8}{t_9X+t_{10}Y+t_{11}Z+t_{12}}
u1=t9X+t10Y+t11Z+t12t1X+t2Y+t3Z+t4v1=t9X+t10Y+t11Z+t12t5X+t6Y+t7Z+t8
为简化表示,定义
T
\bm{T}
T的行向量:
t
1
=
(
t
1
,
t
2
,
t
3
,
t
4
)
T
t
2
=
(
t
1
,
t
2
,
t
3
,
t
4
)
T
t
1
=
(
t
1
,
t
2
,
t
3
,
t
4
)
T
\bm{t}_1=\begin{pmatrix}t_1,t_2,t_3,t_4\end{pmatrix}^T\\ \bm{t}_2=\begin{pmatrix}t_1,t_2,t_3,t_4\end{pmatrix}^T\\ \bm{t}_1=\begin{pmatrix}t_1,t_2,t_3,t_4\end{pmatrix}^T
t1=(t1,t2,t3,t4)Tt2=(t1,t2,t3,t4)Tt1=(t1,t2,t3,t4)T
于是有
t
1
T
P
−
t
3
T
P
u
1
=
0
t
2
T
P
−
t
3
T
P
v
1
=
0
\bm{t}_1^T\bm{P}-\bm{t}_3^T\bm{P}u_1=0\\ \bm{t}_2^T\bm{P}-\bm{t}_3^T\bm{P}v_1=0
t1TP−t3TPu1=0t2TP−t3TPv1=0
注意
t
\bm{t}
t是待求的变量,每个特征点提供了两个关于
t
t
t的线性约束。假设一共有
N
N
N个特征点,则可以列出如下线性方程组:
(
P
1
T
0
−
u
1
P
1
T
0
P
1
T
−
v
1
P
1
T
⋮
⋮
⋮
P
N
T
0
−
u
N
P
N
T
0
P
N
T
−
v
N
P
N
T
)
(
t
1
t
2
t
3
)
=
0
\begin{pmatrix} \bm{P}_1^T&0&-u_1\bm{P}_1^T\\ 0&\bm{P}_1^T&-v_1\bm{P}_1^T\\ \vdots&\vdots&\vdots\\ \bm{P}_N^T&0&-u_N\bm{P}_N^T\\ 0&\bm{P}_N^T&-v_N\bm{P}_N^T \end{pmatrix} \begin{pmatrix} \bm{t}_1\\\bm{t}_2\\\bm{t}_3 \end{pmatrix} =0
P1T0⋮PNT00P1T⋮0PNT−u1P1T−v1P1T⋮−uNPNT−vNPNT
t1t2t3
=0
t
\bm{t}
t一共有12维,因此最少通过6对匹配点即可实现矩阵T的线性求解,这种方法称为DLT。当匹配点大于6对时,也可以使用SVD等方法对超定方程求最小二乘解。
在DLT求解中我们直接将
T
\bm{T}
T矩阵看成了12个未知数,忽略了它们之间的联系。因为旋转矩阵
R
∈
S
O
(
3
)
\bm{R}\in \rm SO(3)
R∈SO(3),用DLT求出的解不一定满足该约束,它是一个一般矩阵。平移向量比较好办,它属于向量空间。对于旋转矩阵
R
\bm{R}
R,我们必须针对DLT估计的
T
\bm{T}
T左侧
3
×
3
3\times 3
3×3矩阵块,寻找一个最好的旋转矩阵对它进行近似。这可以由QR分解完成,也可以像这样来计算:
R
←
(
R
R
T
)
−
1
2
R
\bm{R}\leftarrow (\bm{RR}^T)^{-\frac{1}{2}}\bm{R}
R←(RRT)−21R
最小化重投影误差求解PnP
前面说的线性方程,往往是先求相机位姿,再求空间点位置,非线性优化则是把它们看成优化变量,放在一起优化。
这是一种非常通用的求解方式,我可以用它对PnP和ICP给出的结果进行优化。这一类把相机和三维点放在一起进行最优化的问题,统称为Bundle Adjustment。
考虑n个三维空间点P及其投影p,我们希望计算相机的位姿
R
,
t
\bm{R},\bm{t}
R,t,它的李群表示为
T
\bm{T}
T 。假设某空间点坐标为
P
i
=
[
X
i
,
Y
i
,
Z
i
]
T
\bm{P}_i =[X_i ,Y_i ,Z_i ]^T
Pi=[Xi,Yi,Zi]T ,其投影的像素坐标为
q
i
=
[
u
i
,
v
i
]
T
\bm{q}_i =[u_i ,v_i ]^T
qi=[ui,vi]T 。
s
i
[
u
i
v
i
1
]
=
K
T
[
X
i
Y
i
Z
i
1
]
s_i\begin{bmatrix}u_i\\v_i\\1\end{bmatrix} =\bm{KT}\begin{bmatrix}X_i\\Y_i\\Z_i\\1\end{bmatrix}
si
uivi1
=KT
XiYiZi1
写成矩阵形式:
s
i
q
i
=
K
T
P
i
s_i\bm{q}_i=\bm{KTP}_i
siqi=KTPi
这个式子隐含了一次从齐次坐标到非齐次的转换,由于相机位姿未知及观测点的噪声,该等式存在一个误差。因此,我们把误差求和,构建最小二乘问题,然后寻找最好的相机位姿,使它最小化:
T
∗
=
arg
min
T
1
2
∑
i
=
1
n
∥
u
i
−
1
s
i
K
T
P
i
∥
2
2
\bm{T}^{\ast }=\arg \min _{\bm{T}}\dfrac{1}{2}\sum ^{n}_{i=1}\left\| \bm{u}_{i}-\dfrac{1}{s_{i}}\bm{KTP}_{i}\right\| _{2}^{2}
T∗=argTmin21i=1∑n
ui−si1KTPi
22
该问题的误差项,是将3D点的投影位置与观测位置作差,所以称为重投影误差。 用齐次坐标时,这个误差有3维。不过,由于
u
\bm{u}
u最后一维为1,该维度的误差一直为零, 因而我们更多时使用非齐次坐标,于是误差只有2维了。 我们通过特征匹配知道了
p
1
p_1
p1 和
p
2
p_2
p2 是同一个空间点
P
P
P的投影, 但是不知道相机的位姿。在初始值中,
P
P
P的计算投影
p
^
2
\hat{p}_2
p^2 与实际的
p
2
p_2
p2之间有一定的距离。于是我们调整相机的位姿,使得这个距离变小 。不过,由于这个调整需要考虑很多个点,所以最后追求的效果是整体误差的缩小,而每个点的误差通常不会精确为零。
我们需要知道每个误差项关于优化变量的导数,也就是线性化
e
(
x
+
Δ
x
)
≈
e
(
x
)
+
J
T
Δ
x
\bm{e}\left( \bm{x}+\Delta \bm{x}\right) \approx \bm{e}\left( \bm{x}\right) +\bm{J}^{T}\Delta \bm{x}
e(x+Δx)≈e(x)+JTΔx
当
e
\bm{e}
e为像素坐标误差(2维),
x
\bm{x}
x为相机位姿(6维)时,
J
T
\bm{J}^T
JT将是一个
2
×
6
2\times 6
2×6的矩阵。
P
′
=
(
T
P
)
1
:
3
=
[
X
′
,
Y
′
,
Z
′
]
T
\bm{P}'=\left( \bm{TP}\right) _{1:3}=\left[ X',Y',Z'\right] ^{T}
P′=(TP)1:3=[X′,Y′,Z′]T
那么,相机投影模型相对于
P
′
\bm{P}'
P′为
s
q
=
K
P
′
s\bm{q} =\bm{KP}'
sq=KP′
展开:
[
s
u
s
v
s
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
′
Y
′
Z
′
]
\begin{bmatrix} su \\ sv \\ s \end{bmatrix}=\begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} X' \\ Y' \\ Z' \end{bmatrix}
susvs
=
fx000fy0cxcy1
X′Y′Z′
利用第三行消去
s
s
s(实际上就是
P
′
\bm{P}'
P′的
Z
′
Z'
Z′),得
u
=
f
x
X
′
Z
′
+
c
x
v
=
f
y
Y
′
Z
′
+
c
y
u=f_{x}\dfrac{X'}{Z'}+c_{x} \\ v=f_{y}\dfrac{Y'}{Z'}+c_{y}
u=fxZ′X′+cxv=fyZ′Y′+cy
在定义了中间变量后,我们对
T
\bm{T}
T左乘扰动量
δ
ξ
\delta \bm{\xi}
δξ,然后考虑
e
e
e的变化关于扰动量的导数。利用链式法则,可以列写如下:
∂
e
∂
δ
ξ
=
lim
δ
ξ
→
0
e
(
δ
ξ
⊕
ξ
)
−
e
(
ξ
)
δ
ξ
=
∂
e
∂
P
′
∂
P
′
∂
δ
ξ
\dfrac{\partial \bm{e}}{\partial \delta \bm{\xi} }=\lim _{\delta \bm{\xi} \rightarrow 0}\dfrac{\bm{e}\left( \delta \bm{\xi} \oplus \bm{\xi} \right) -\bm{e}\left( \bm{\xi} \right) }{\delta \bm{\xi} }=\dfrac{\partial \bm{e}}{\partial \bm{P}'}\dfrac{\partial \bm{P}'}{\partial \delta \bm{\xi} }
∂δξ∂e=δξ→0limδξe(δξ⊕ξ)−e(ξ)=∂P′∂e∂δξ∂P′
这里的
⊕
\oplus
⊕指李代数上的左乘扰动。第一项是误差关于投影点的导数, 已列出了变量之的关 ,易得:
∂
e
∂
P
′
=
∂
[
u
−
u
,
v
−
v
]
T
∂
P
′
=
[
∂
u
∂
X
′
∂
u
∂
Y
′
∂
u
∂
Z
′
∂
v
∂
X
′
∂
v
∂
Y
′
∂
v
∂
Z
′
]
=
[
f
x
Z
′
0
−
f
x
X
′
Z
′
2
0
f
y
Z
′
−
f
y
Y
′
Z
′
2
]
\dfrac{\partial \bm{e}}{\partial \bm{P}'}=\dfrac{\partial \left[ u- {u},v- {v}\right] ^{T}}{\partial \bm{P}'} =\begin{bmatrix} \dfrac{\partial u}{\partial X'} & \dfrac{\partial u}{\partial Y'} & \dfrac{\partial u}{\partial Z'} \\ \dfrac{\partial v}{\partial X'} & \dfrac{\partial v}{\partial Y'} & \dfrac{\partial v}{\partial Z'} \end{bmatrix} =\begin{bmatrix} \dfrac{f_{x}}{Z'} & 0 & -\dfrac{f_{x} X'}{Z'^{2}} \\ 0 & \dfrac{f_{y}}{Z'} & -\dfrac{f_{y}Y'}{Z'^{2}} \end{bmatrix}
∂P′∂e=∂P′∂[u−u,v−v]T=
∂X′∂u∂X′∂v∂Y′∂u∂Y′∂v∂Z′∂u∂Z′∂v
=
Z′fx00Z′fy−Z′2fxX′−Z′2fyY′
而第二项为变换后的点关于李代数的导数 ,得:
∂
P
′
∂
δ
ξ
=
∂
(
T
P
)
1
:
3
∂
δ
ξ
=
(
T
P
)
1
:
3
⊙
=
[
I
−
P
′
∧
0
T
0
T
]
1
:
3
=
[
I
−
P
′
∧
]
\dfrac{\partial \bm{P}'}{\partial \delta \bm{\xi} }=\dfrac{\partial \left( \bm{TP}\right)_{1:3} }{\partial \delta \bm{\xi} }=\left( \bm{TP}\right) ^{\odot}_{1:3}=\begin{bmatrix} \bm{I} & -\bm{P}'^{\wedge} \\ \bm{0}^{T} & \bm{0}^{T} \end{bmatrix}_{1:3}=\begin{bmatrix} \bm{I} & -\bm{P}'^{\wedge} \end{bmatrix}
∂δξ∂P′=∂δξ∂(TP)1:3=(TP)1:3⊙=[I0T−P′∧0T]1:3=[I−P′∧]
这两项相乘,得
2
×
6
2\times 6
2×6的雅可比矩阵:
∂
e
∂
δ
ξ
=
[
f
x
Z
′
0
−
f
x
X
′
Z
′
2
−
f
x
X
′
Y
′
Z
′
2
f
x
+
f
x
X
′
2
Z
′
2
−
f
x
Y
′
Z
′
0
f
y
Z
′
−
f
x
Y
′
Z
′
2
−
f
y
−
f
y
Y
′
2
Z
′
2
f
x
X
′
Y
′
Z
′
2
f
y
X
′
Z
′
]
\dfrac{\partial \bm{e}}{\partial \delta \bm{\xi} }=\begin{bmatrix} \dfrac{f_{x}}{Z'} & 0 & -\dfrac{f_{x}X'}{Z'^2} & -\dfrac{f_{x}X'Y'}{Z'^2} & f_{x}+\dfrac{f_{x }X'^{2}}{Z'^{2}} & -\dfrac{f_x Y'}{Z'} \\ 0 & \dfrac{f_{y}}{Z'} & -\dfrac{f_x Y'}{Z'^2} & -f_{y}-\dfrac{f_{y}Y'^{2}}{Z'^2} & \dfrac{f_{x}X'Y'}{Z'^{2}} & \dfrac{f_{y}X'}{Z'} \end{bmatrix}
∂δξ∂e=
Z′fx00Z′fy−Z′2fxX′−Z′2fxY′−Z′2fxX′Y′−fy−Z′2fyY′2fx+Z′2fxX′2Z′2fxX′Y′−Z′fxY′Z′fyX′
这个雅可比矩阵描述了重投影误差关于相机位姿李代数的一阶变化关系 。
除了优化位姿,我们还希望优化特征点的空间位置。因此需要讨论
e
\bm{e}
e关于空间点
P
\bm{P}
P的导数。
使用链式法则,有
∂
e
∂
P
=
∂
e
∂
P
′
∂
P
′
∂
P
\dfrac{\partial \bm{e}}{\partial \bm{P}}=\dfrac{\partial \bm{e}}{\partial \bm{P}'}\dfrac{\partial \bm{P}'}{\partial \bm{P}}
∂P∂e=∂P′∂e∂P∂P′
第一项在前面已经推导,关于第二项,按照定义
P
′
=
(
T
P
)
1
:
3
=
R
P
+
t
\bm{P}'=\left( \bm{TP}\right) _{1:3}=\bm{RP+t}
P′=(TP)1:3=RP+t
P
′
\bm{P}'
P′对
P
\bm{P}
P求导得
R
\bm{R}
R。于是:
∂
e
∂
P
=
[
f
x
Z
′
0
−
f
x
X
′
Z
′
2
0
f
y
Z
′
−
f
y
Y
′
Z
′
2
]
R
\dfrac{\partial \bm{e}}{\partial \bm{P}}=\begin{bmatrix} \dfrac{f_{x}}{Z'} & 0 & -\dfrac{f_x X'}{Z'^2} \\ 0 & \dfrac{f_y}{Z'} & -\dfrac{f_yY'}{Z'^2} \end{bmatrix}\bm{R}
∂P∂e=
Z′fx00Z′fy−Z′2fxX′−Z′2fyY′
R
我们推导出了观测相机方程关于相机位姿和特征点的两个Jacobian矩阵,它们能够子优化过程中提供迭代的方向,之后使用高斯-牛顿法或LM方法迭代求解最优解即可。