EPnP: An Accurate O(n) Solution to the PnPProblem详解
EPnP算法的中心思想就是以四个世界坐标系下的控制点 [ c w 1 c w 2 c w 3 c w 4 ] [c_w^1 \quad c_w^2 \quad c_w^3 \quad c_w^4] [cw1cw2cw3cw4]通过投影约束和欧式变换下的距离不变约束,求解相机坐标系下的相应控制点 [ c c 1 c c 2 c c 3 c c 4 ] [c_c^1 \quad c_c^2 \quad c_c^3 \quad c_c^4] [cc1cc2cc3cc4],最后使用高斯牛顿优化法,对欧式变换的距离约束进行优化,优化参数为重新线性化技术的权重参数。
1. 算法亮点
- 算法是封闭式非迭代算法,算法的时间复杂度只有 O ( n ) O(n) O(n)
- 在封闭式非迭代算法中,该算法求解PnP问题的准确率最高
- 当加入高斯牛顿优化器,进行重新线性化权重参数优化时,其准确率接近迭代算法中准确率最高的方法==《Fast and globally convergent pose estimation from video images》==
- 除此之外,EPnP的结果可以作为迭代算法的迭代初始值
2. 算法前置知识
2.1 奇异值和奇异向量
- 奇异值分解(SVD),可以将矩阵 A A A ( m × n ) (m\times n) (m×n)分解为 A = U Σ V T A=U\Sigma V^{T} A=UΣVT
- 左奇异向量为矩阵 U U U的列
- 右奇异向量为矩阵 V V V的列
2.2 奇异向量和特征向量
- 右奇异向量是 A T A A^{T}A ATA的特征向量
- 左奇异向量是 A A T AA^T AAT的特征向量
2.3 重新线性化技术
重新线性化技术是一种密码公钥HFE分析技术,通过引入其他约束,可以解决欠定方程的根求解问题。
- 针对欠定方程
M
x
=
0
Mx=0
Mx=0
- 方程的解x可以表示为 x = ∑ i = 1 N β i v i x=\sum_{i=1}^N\beta_iv_i x=∑i=1Nβivi,其中 v i v_i vi是矩阵M的0奇异值对应的右奇异向量, β i \beta_i βi是待定系数
- 可以通过矩阵 M T M M^TM MTM的零特征值对应的零特征向量给出矩阵 M M M的零奇异值对应的右奇异向量
- 引入其他约束后,可以对欠定方程的根进行求解
3. 算法流程
3.1 世界坐标系控制点选取
- 将输入的世界坐标系下的3D点的质心作为其中一个 c w c_w cw(世界坐标系控制点)
- 采用与数据主方向对齐的方式选择其余点(这是一种和DLT算法相似的标准化方式)
3.2 根据控制点确定重心坐标
- p i w = ∑ j = 1 4 α i j c j w ∑ j = 1 4 α i j = 1 ⟶ [ x 1 x 2 x 3 x 4 y 1 y 2 y 3 y 4 z 1 z 2 z 3 z 4 1 1 1 1 ] [ α 1 α 2 α 3 α 4 ] = [ X w Y w Z w 1 ] p_i^{w}=\sum_{j=1}^4 \alpha_{ij}c_j^w \quad \sum_{j=1}^4 \alpha_{ij}=1 \longrightarrow \begin{bmatrix} x_1 & x_2 & x_3 & x_4 \\ y_1 & y_2 & y_3 & y_4 \\ z_1 & z_2 & z_3 & z_4 \\ 1 & 1 & 1 & 1\end{bmatrix} \begin{bmatrix} \alpha_1 \\ \alpha_2 \\ \alpha_3 \\ \alpha_4 \end{bmatrix}=\begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} piw=∑j=14αijcjw∑j=14αij=1⟶ x1y1z11x2y2z21x3y3z31x4y4z41 α1α2α3α4 = XwYwZw1 ,可求解 α i \alpha_i αi
- p i c = ∑ j = 1 4 α i j c j c p_i^c=\sum_{j=1}^4\alpha_{ij}c_j^c pic=∑j=14αijcjc(相机坐标系下的三维点表示)
3.3 相机坐标的投影约束
- w i [ u i v i 1 ] = [ f u 0 u c 0 f v v c 0 0 1 ] ∑ j = 1 4 α i j [ x j c y j c z j c ] ⟶ { ∑ j = 1 4 α i j f u x j c + α i j ( u c − u i ) z j c = 0 ∑ j = 1 4 α i j f v y j c + α i j ( v c − v i ) z j c = 0 w_i \begin{bmatrix} u_i\\v_i\\1 \end{bmatrix}=\begin{bmatrix} f_u & 0 & u_c \\ 0 & f_v & v_c \\ 0 & 0 & 1 \end{bmatrix}\sum_{j=1}^4\alpha_{ij}\begin{bmatrix} x_j^c \\ y_j^c \\ z_j^c \end{bmatrix} \longrightarrow \left \{ \begin{array}{lcl} \sum_{j=1}^4 \alpha_{ij}f_ux_j^c+\alpha_{ij}(u_c-u_i)z_j^c=0 \\ \sum_{j=1}^4\alpha_{ij}f_vy_j^c+\alpha_{ij}(v_c-v_i)z_j^c=0 \end{array}\right. wi uivi1 = fu000fv0ucvc1 ∑j=14αij xjcyjczjc ⟶{∑j=14αijfuxjc+αij(uc−ui)zjc=0∑j=14αijfvyjc+αij(vc−vi)zjc=0
- 选取 N N N个点,可得线性系统 M x = 0 Mx=0 Mx=0,其中 M M M矩阵为 2 n × 12 2n\times 12 2n×12维, x = [ c 1 T , c 2 T , c 3 T , c 4 T ] T x=[c_1^T,c_2^T,c_3^T,c_4^T]^T x=[c1T,c2T,c3T,c4T]T
3.4 求解方程 M x = 0 Mx=0 Mx=0
- 根据重新线性化技术,可得解为 x = ∑ i = 1 N β i v i x=\sum_{i=1}^N \beta_iv_i x=∑i=1Nβivi
- 根据相机焦距和矩阵 M M M奇异值的实验发现,随着相机焦距的增加, N N N也随之增加,总体来讲在1到4之间
- EPnP会对N取 { 1 , 2 , 3 , 4 } \left \{1, 2, 3, 4\right \} {1,2,3,4},计算四个结果,然后根据重投影误差,选出最少的那个作为解
3.5 分类讨论(引入刚性变换下的向量二范数的距离约束,来求解 β i \beta_i βi)
3.5.1 对于非平面的情况,四个控制点
- 当
N
=
1
N=1
N=1时,
x
=
β
v
x=\beta v
x=βv
- ∣ ∣ x [ i ] − x [ j ] ∣ ∣ 2 = ∣ ∣ c i w − c j w ∣ ∣ 2 ⟶ ∣ ∣ β v [ i ] − β v [ j ] ∣ ∣ 2 = ∣ ∣ c i w − c j w ∣ ∣ 2 ||{x^{[i]}-x^{[j]}}||^2=||{c_i^w-c_j^w}||^2 \longrightarrow ||{\beta v^{[i]}-\beta {v^{[j]}}||^2=||{c_i^w-c_j^w}||^2} ∣∣x[i]−x[j]∣∣2=∣∣ciw−cjw∣∣2⟶∣∣βv[i]−βv[j]∣∣2=∣∣ciw−cjw∣∣2
- 由于在世界坐标下给出了相应的点的真实位置,因此 β = ∑ i j ∈ [ 1 , 4 ] ∣ ∣ β v [ i ] − β v [ j ] ∣ ∣ 2 ∑ i j ∈ [ 1 , 4 ] ∣ ∣ v i − v j ∣ ∣ 2 \beta=\frac{\sum_{ij\in[1,4]}||\beta v^{[i]}-\beta v^{[j]}||^2}{\sum_{ij\in[1,4]}||v^i-v^j||^2} β=∑ij∈[1,4]∣∣vi−vj∣∣2∑ij∈[1,4]∣∣βv[i]−βv[j]∣∣2
- 当
N
=
2
N=2
N=2时,
x
=
β
1
v
1
+
β
2
v
2
x=\beta_1v_1+\beta_2v_2
x=β1v1+β2v2
- ∣ ∣ ( β 1 v 1 [ i ] + β 2 v 2 [ i ] ) − ( β 1 v 1 [ j ] + β 2 v 2 [ j ] ) ∣ ∣ 2 = ∣ ∣ c i w − c j w ∣ ∣ 2 ||(\beta_1 v_1^{[i]}+\beta_2 v_2^{[i]})-(\beta_1 v_1^{[j]}+\beta_2v_2^{[j]})||^2=||c_i^w-c_j^w||^2 ∣∣(β1v1[i]+β2v2[i])−(β1v1[j]+β2v2[j])∣∣2=∣∣ciw−cjw∣∣2
- 通过引入向量 β = [ β 11 β 12 β 22 ] T ⟶ [ β 1 2 β 1 β 2 β 2 2 ] T \beta=\begin{bmatrix} \beta_{11} & \beta_{12} & \beta_{22} \end{bmatrix}^T\longrightarrow \begin{bmatrix} \beta_1^2 & \beta_1\beta_2 & \beta_2^2 \end{bmatrix}^T β=[β11β12β22]T⟶[β12β1β2β22]T,使得方程 L β = ρ L\beta=\rho Lβ=ρ成立
- 其中, L L L是 v 1 v_1 v1和 v 2 v_2 v2组成的矩阵, ρ \rho ρ是世界坐标系点之间的距离范数
- 通过 S V D SVD SVD分解,或者 L L L矩阵的伪逆来计算向量 β \beta β
- 对 β \beta β进行分解,保证计算得到的相机坐标系下的3D点都具有正的深度,来筛选一组最合适的 β 1 β 2 β 3 \beta_1 \quad \beta_2 \quad \beta_3 β1β2β3
- 最后,为了消除尺度的影响,采用 N = 1 N=1 N=1的方式进行缩放系数的求解 c i c = β ( β 1 v 1 [ i ] + β 2 v 2 [ i ] ) c_i^c=\beta(\beta_1v_1^{[i]}+\beta_2v_2^{[i]}) cic=β(β1v1[i]+β2v2[i])
- 当
N
=
3
N=3
N=3时,
x
=
β
1
v
1
+
β
2
v
2
+
β
3
v
3
x=\beta_1v_1+\beta_2v_2+\beta_3v_3
x=β1v1+β2v2+β3v3
- 按照 N = 2 N=2 N=2的方式,进行求解
- 注意,这里唯一不同的是,矩阵 L L L是方阵,可以使用矩阵的逆而不是伪逆求解向量
- 当
N
=
4
N=4
N=4时,
x
=
β
1
v
1
+
β
2
v
2
+
β
3
v
3
+
β
4
v
4
x=\beta_1v_1+\beta_2v_2+\beta_3v_3+\beta_4v_4
x=β1v1+β2v2+β3v3+β4v4
- 按照 N = 2 N=2 N=2的方式进行求解
- 得到的矩阵 L L L的维度是 6 × 10 6\times10 6×10维的,因此不能直接进行求解
- 通过重新线性化的方式进行求解,求解的方式与确定控制点的方式相同
- β = ∑ i = 1 N k i v i \beta=\sum_{i=1}^Nk_iv_i β=∑i=1Nkivi, v i v_i vi是矩阵 L L L的0奇异值对应的右奇异向量,可以将 β \beta β采用 k i k_i ki进行表示
- 根据乘法交换律,添加新的约束 β a b β c d = β a β b β c β d = β a ′ β b ′ β c ′ β d ′ \beta_{ab}\beta_{cd}=\beta_a\beta_b\beta_c\beta_d=\beta_a'\beta_b'\beta_c'\beta_d' βabβcd=βaβbβcβd=βa′βb′βc′βd′
3.5.2 对于平面的情况,3个控制点
- 矩阵 M M M的维度会变成 2 n × 9 2n\times9 2n×9,因为控制点变成了三个,从而向量 x x x变成了9维列向量
-
x
=
∑
i
=
1
N
β
i
v
i
x=\sum_{i=1}^N \beta_iv_i
x=∑i=1Nβivi的改变
- 当 N = 1 N=1 N=1时,与非平面,四个控制点无区别
- 当 N = 2 N=2 N=2时,矩阵 L L L的维度变为 3 × 3 3\times3 3×3,可以直接通过求逆的方式解出来,与非平面 N = 3 N=3 N=3的情况类似
- 当 N = 3 N=3 N=3时,矩阵 L L L的维度变为 3 × 6 3\times6 3×6,通过乘法交换律约束,进行重新线性化,与同平面 N = 4 N=4 N=4的情况
- 当 N = 4 N=4 N=4时,矩阵 L L L的维度变为 3 × 10 3\times10 3×10,通过乘法交换律约束,进行重新线性化,与同平面 N = 4 N=4 N=4的情况
3.6 高斯牛顿优化法
- 通过对上述的 N N N进行分情况讨论,可以选择一个重投影误差最小的 N N N
- 然后对应的 β = [ β 1 β 2 … β N ] T \beta=\begin{bmatrix} \beta_1&\beta_2 & … & \beta_N \end{bmatrix}^T β=[β1β2…βN]T进行高斯牛顿优化,当 N = 4 N=4 N=4时,高斯牛顿优化具有最高的时间复杂度,优化函数为 E r r o r ( β ) = ∑ ( i , j ) s . t . i < j ( ∣ ∣ c i c − c j c ∣ ∣ 2 − ∣ ∣ c i w − c j w ∣ ∣ 2 ) Error(\beta)=\sum_{(i,j)s.t.i<j}(||c_i^c-c_j^c||^2-||c_i^w-c_j^w||^2) Error(β)=∑(i,j)s.t.i<j(∣∣cic−cjc∣∣2−∣∣ciw−cjw∣∣2),其中 c i c = ∑ j = 1 N β j v j [ i ] c_i^c=\sum_{j=1}^N\beta_jv_j^{[i]} cic=∑j=1Nβjvj[i],由于需要优化的参数最多为4,并且优化的方程复杂度为6,因此优化时间可以认为是固定时间,且很短
3.7 ICP方法恢复运动 R t R \quad t Rt
- { R c w c 1 w + t c w = c 1 c R c w c 2 w + t c w = c 2 c R c w c 3 w + t c w = c 3 c R c w c 4 w + t c w = c 4 c \left\{ \begin{array}{lcl} R_{cw}c_1^w+t_{cw}=c_1^c \\ R_{cw}c_2^w+t_{cw}=c_2^c \\ R_{cw}c_3^w+t_{cw}=c_3^c \\ R_{cw}c_4^w+t_{cw}=c_4^c \end{array} \right. ⎩ ⎨ ⎧Rcwc1w+tcw=c1cRcwc2w+tcw=c2cRcwc3w+tcw=c3cRcwc4w+tcw=c4c
- 根据罗德里格斯公式,将公式中的旋转矩阵使用旋转向量来表示 R = cos θ I + ( 1 − cos θ ) n n T + sin θ ( n × ) R=\cos \theta I+(1-\cos \theta)nn^T+\sin\theta (n\times) R=cosθI+(1−cosθ)nnT+sinθ(n×),方程的自由度变成6
- 使用DLT直接线性变换将上述方程变成 A x = 0 Ax=0 Ax=0的形式,进行SVD分解,求解方程的最小二乘解