三维重建【0-D】3D Gaussian Splatting:相机标定原理与步骤
三维重建【0-D】3D Gaussian Splatting:相机标定原理与步骤
- 前言
- 张正友相机标定法数学推导求解
前言
基于前面的学习,通过相机成像几何模型,我们知道了如何将世界坐标系中的三维坐标和像素坐标系中的二维坐标联系起来。此外,根据标定棋盘图纸及其对应的照片已经得到了单应性矩阵H(H是内参矩阵和外参矩阵的混合体)。
张正友相机标定法数学推导求解
首先不考虑镜头畸变,求解思路是利用旋转向量的约束关系,先将单应性矩阵H化为3个列向量H=[h1h2h3]H=[h_1 \space h_2 \space h_3]H=[h1 h2 h3]
H=[h1h2h3]=sM[r1r2t]H=[h_1 \space h_2 \space h_3]=sM[r_1 \space r_2 \space t]H=[h1 h2 h3]=sM[r1 r2 t]
则可以得到:

r1r_1r1和r2r_2r2相互正交,由此可以利用“”正交的两个含义,得出每个单应矩阵提供的两个约束条件:
- 约束条件1: 旋转向量点积为0(两垂直平面上的旋转向量互相垂直),即:

- 约束条件2: 旋转向量长度相等(旋转不改变尺度),即:

那么如何利用上述两个约束条件求解内参或者外参呢?我们一步一步来看,由前面可知内参矩阵M:

根据前面的公式,令B=(M−1)TM−1B=(M^{-1})^{T}M^{-1}B=(M−1)TM−1,则:
由于M=[fxγu00fyv0001]M=\begin{bmatrix} f_x & \gamma & u_0\\ 0 & f_y & v_0\\ 0 & 0 & 1 \end{bmatrix}M=fx00γfy0u0v01,则 ∣M∣=fxfy|M|=f_xf_y∣M∣=fxfy,则:
Adj(M)=[fy−γγv0−fyu00fx−fxv000fxfy]Adj(M)=\begin{bmatrix} f_y & -\gamma & \gamma v_0-f_yu_0\\ 0 & f_x & -f_xv_0\\ 0 & 0 & f_xf_y \end{bmatrix}Adj(M)=fy00−γfx0γv0−fyu0−fxv0fxfy
则有:
M−1=1fxfy[fy−γγv0−fyu00fx−fxv000fxfy]M^{-1}=\frac{1}{f_xf_y}\begin{bmatrix} f_y & -\gamma & \gamma v_0-f_yu_0\\ 0 & f_x & -f_xv_0\\ 0 & 0 & f_xf_y \end{bmatrix}M−1=fxfy1fy00−γfx0γv0−fyu0−fxv0fxfy
则有:
(M−1)T=[1fx00−γfxfy1fy0γv0−fyu0fxfy−v0fy1](M^{-1})^{T}=\begin{bmatrix} \frac{1}{f_x} & 0 & 0\\ \frac{-\gamma}{f_xf_y} & \frac{1}{f_y} & 0\\ \frac{\gamma v_0-f_yu_0}{f_xf_y} & \frac{-v_0}{f_y} & 1 \end{bmatrix}(M−1)T=fx1fxfy−γfxfyγv0−fyu00fy1fy−v0001
则有:
M−1=[1fx−γfxfyγv0−fyu0fxfy01fy−v0fy001]M^{-1}=\begin{bmatrix} \frac{1}{f_x} & \frac{-\gamma}{f_xf_y} & \frac{\gamma v_0-f_yu_0}{f_xf_y}\\ 0 & \frac{1}{f_y} & \frac{-v_0}{f_y}\\ 0 & 0 & 1 \end{bmatrix}M−1=fx100fxfy−γfy10fxfyγv0−fyu0fy−v01
则有:
B=(M−1)TM−1=[1fx2−γfx2fyγv0−fyu0fx2fy−γfx2fyγ2fx2fy2+1fy2−γγv0−fyu0fx2fy2−v0fy2γv0−fyu0fx2fy−γγv0−fyu0fx2fy2−v0fy2(γv0−fyu0)2fx2fy2+v0fy2+1]=[B11B12B13B21B22B23B31B32B33]B=(M^{-1})^{T}M^{-1}=\begin{bmatrix} \frac{1}{f_x^{2}} & \frac{-\gamma}{f_x^{2}f_y} & \frac{\gamma v_0-f_yu_0}{f_x^{2}f_y}\\ \frac{-\gamma}{f_x^{2}f_y} & \frac{\gamma ^{2}}{f_x^{2}f_y^{2}} + \frac{1}{f_y^{2}} & -\gamma \frac{\gamma v_0-f_yu_0}{f_x^{2}f_y^{2}}-\frac{v_0}{f_y^{2}}\\ \frac{\gamma v_0-f_yu_0}{f_x^{2}f_y} & -\gamma \frac{\gamma v_0-f_yu_0}{f_x^{2}f_y^{2}}-\frac{v_0}{f_y^{2}} & \frac{(\gamma v_0-f_yu_0)^{2}}{f_x^{2}f_y^{2}}+\frac{v_0}{f_y^{2}}+1 \end{bmatrix}=\begin{bmatrix} B_{11} & B_{12} &B_{13} \\ B_{21} & B_{22} &B_{23} \\ B_{31} & B_{32} &B_{33} \end{bmatrix}B=(M−1)TM−1=fx21fx2fy−γfx2fyγv0−fyu0fx2fy−γfx2fy2γ2+fy21−γfx2fy2γv0−fyu0−fy2v0fx2fyγv0−fyu0−γfx2fy2γv0−fyu0−fy2v0fx2fy2(γv0−fyu0)2+fy2v0+1=B11B21B31B12B22B32B13B23B33
可以发现BBB是对称矩阵,真正有用的元素只有6个(主对角线任意一侧的6个元素),则可以将B用一个6D的向量b定义,即:
b=[B11B12B22B13B23B33]b=\begin{bmatrix} B_{11} \\ B_{12} \\ B_{22} \\ B_{13} \\ B_{23} \\ B_{33} \end{bmatrix}b=B11B12B22B13B23B33
将B带入前面两个约束条件后转换为:
{h1TBh2=0h1TBh1=h2TBh2\left\{ \begin{aligned} h_1^{T}Bh_2&=0 \\ h_1^{T}Bh_1&=h_2^{T}Bh_2 \end{aligned} \right. {h1TBh2h1TBh1=0=h2TBh2
定义3×33 \times 33×3的单应矩阵H=[h1h2h3]H=[h_1 \space h_2 \space h_3]H=[h1 h2 h3]的第iii列列向量:
hi=[hi1,hi2,hi3]Th_i=[h_{i1}, h_{i2}, h_{i3}]^{T}hi=[hi1,hi2,hi3]T
为了简化表达,则:hiTBhj=[hi1hi2hi3][B11B12B13B21B22B23B31B32B33][hj1hj2hj3]h_i^{T}Bh_j=\begin{bmatrix} h_{i1} & h_{i2} & h_{i3} \end{bmatrix} \begin{bmatrix} B_{11} & B_{12} &B_{13} \\ B_{21} & B_{22} &B_{23} \\ B_{31} & B_{32} &B_{33} \end{bmatrix}\begin{bmatrix} h_{j1} \\ h_{j2} \\ h_{j3} \end{bmatrix}hiTBhj=[hi1hi2hi3]B11B21B31B12B22B32B13B23B33hj1hj2hj3
则有:hiTBhj=[hi1B11+hi2B21+hi3B31hi1B12+hi2B22+hi3B32hi1B13+hi2B23+hi3B33]T[hj1hj2hj3]h_i^{T}Bh_j=\begin{bmatrix} h_{i1}B_{11} + h_{i2}B_{21} + h_{i3}B_{31}\\ h_{i1}B_{12} + h_{i2}B_{22} + h_{i3}B_{32}\\ h_{i1}B_{13} + h_{i2}B_{23} + h_{i3}B_{33} \end{bmatrix}^{T}\begin{bmatrix} h_{j1} \\ h_{j2} \\ h_{j3} \end{bmatrix}hiTBhj=hi1B11+hi2B21+hi3B31hi1B12+hi2B22+hi3B32hi1B13+hi2B23+hi3B33Thj1hj2hj3
其中等式右边第一个式子是一个1×31 \times 31×3的行向量,则有:
hiTBhj=hi1hj1B11+hi2hj1B21+hi3hj1B31+hi1hj2B12+hi2hj2B22+hi3hj2B32+hi1hj3B13+hi2hj3B23+hi3hj3B33h_i^{T}Bh_j=h_{i1}h_{j1}B_{11} + h_{i2}h_{j1}B_{21} + h_{i3}h_{j1}B_{31} + h_{i1}h_{j2}B_{12} + h_{i2}h_{j2}B_{22} + h_{i3}h_{j2}B_{32} + h_{i1}h_{j3}B_{13} + h_{i2}h_{j3}B_{23} + h_{i3}h_{j3}B_{33}hiTBhj=hi1hj1B11+hi2hj1B21+hi3hj1B31+hi1hj2B12+hi2hj2B22+hi3hj2B32+hi1hj3B13+hi2hj3B23+hi3hj3B33
因为B是对称矩阵,则合并有:
[hi1hj1hi1hj2+hi2hj1hi2hj2hi1hj3+hi3hj1hi3hj2+hi2hj3hi3hj3]T[B11B12B22B13B23B33]=vijTb\begin{bmatrix} h_{i1}h_{j1} \\ h_{i1}h_{j2} + h_{i2}h_{j1} \\ h_{i2}h_{j2} \\ h_{i1}h_{j3} + h_{i3}h_{j1} \\ h_{i3}h_{j2} + h_{i2}h_{j3} \\ h_{i3}h_{j3} \end{bmatrix}^{T}\begin{bmatrix} B_{11} \\ B_{12} \\ B_{22} \\ B_{13} \\ B_{23} \\ B_{33} \end{bmatrix}=v_{ij}^{T}bhi1hj1hi1hj2+hi2hj1hi2hj2hi1hj3+hi3hj1hi3hj2+hi2hj3hi3hj3TB11B12B22B13B23B33=vijTb
由此得到:
hiTBhj=vijTbh_i^{T}Bh_j=v_{ij}^{T}bhiTBhj=vijTb
从而有:
{h1TBh2=v12Tb=0v11Tb−v22Tb=0\left\{ \begin{aligned} h_1^{T}Bh_2 = v_{12}^{T}b &=0 \\ v_{11}^{T}b-v_{22}^{T}b&=0 \end{aligned} \right. {h1TBh2=v12Tbv11Tb−v22Tb=0=0
进一步推导可以将两个约束表达式转化为下面未知数为向量b的齐次方程:
[v12T(v11−v22)T]b=0\begin{bmatrix} v_{12}^T \\ (v_{11}-v_{22})^{T} \end{bmatrix}b=0[v12T(v11−v22)T]b=0
如果我们拍摄了n张不同角度的标定图像,因为每张图像我们都可以得到一组(2个)上述的等式。其中,v11v_{11}v11、v12v_{12}v12、v22v_{22}v22可以通过前面已经计算好的单应矩阵得到,因此是已知的,而bbb中的6个元素是代求的未知数。因此,至少要保证图像数量>=3,才可以求解出bbb。需要注意的是,这里的bbb是带有比例因子的。
基于此,可以进行内参矩阵的求解,由于之前B=(M−1)TM−1B=(M^{-1})^{T}M^{-1}B=(M−1)TM−1的推导结论,再加入一个比例因子,则有:
B=λ(M−1)TM−1=λ[1fx2−γfx2fyγv0−fyu0fx2fy−γfx2fyγ2fx2fy2+1fy2−γγv0−fyu0fx2fy2−v0fy2γv0−fyu0fx2fy−γγv0−fyu0fx2fy2−v0fy2(γv0−fyu0)2fx2fy2+v0fy2+1]=[B11B12B13B21B22B23B31B32B33]B=\lambda (M^{-1})^{T}M^{-1}=\lambda \begin{bmatrix} \frac{1}{f_x^{2}} & \frac{-\gamma}{f_x^{2}f_y} & \frac{\gamma v_0-f_yu_0}{f_x^{2}f_y}\\ \frac{-\gamma}{f_x^{2}f_y} & \frac{\gamma ^{2}}{f_x^{2}f_y^{2}} + \frac{1}{f_y^{2}} & -\gamma \frac{\gamma v_0-f_yu_0}{f_x^{2}f_y^{2}}-\frac{v_0}{f_y^{2}}\\ \frac{\gamma v_0-f_yu_0}{f_x^{2}f_y} & -\gamma \frac{\gamma v_0-f_yu_0}{f_x^{2}f_y^{2}}-\frac{v_0}{f_y^{2}} & \frac{(\gamma v_0-f_yu_0)^{2}}{f_x^{2}f_y^{2}}+\frac{v_0}{f_y^{2}}+1 \end{bmatrix}=\begin{bmatrix} B_{11} & B_{12} &B_{13} \\ B_{21} & B_{22} &B_{23} \\ B_{31} & B_{32} &B_{33} \end{bmatrix}B=λ(M−1)TM−1=λfx21fx2fy−γfx2fyγv0−fyu0fx2fy−γfx2fy2γ2+fy21−γfx2fy2γv0−fyu0−fy2v0fx2fyγv0−fyu0−γfx2fy2γv0−fyu0−fy2v0fx2fy2(γv0−fyu0)2+fy2v0+1=B11B21B31B12B22B32B13B23B33
对等式进行求解得:

得到内参数后,内参矩阵M也已知。单应矩阵H也已知,因此可以继续求得外参数:

又由标准旋转矩阵的性质可以得到r3=r1×r2r_3=r_1 \times r_2r3=r1×r2,∣∣r1∣∣=∣∣r2∣∣=∣∣λM−1h2∣∣=∣∣=λM−1h1∣∣=1||r_1||=||r_2||=||\lambda M^{-1}h_2||=||=\lambda M^{-1}h_1||=1∣∣r1∣∣=∣∣r2∣∣=∣∣λM−1h2∣∣=∣∣=λM−1h1∣∣=1得:
s=∣∣M−1h1∣∣=∣∣M−1h2∣∣s=||M^{-1}h_1||=||M^{-1}h_2||s=∣∣M−1h1∣∣=∣∣M−1h2∣∣
综上所述,有:
{s=∣∣M−1h1∣∣=∣∣M−1h2∣∣r1=λM−1h1r2=λM−1h2r3=r1×r2t=λM−1h3\left\{ \begin{aligned} & s = ||M^{-1}h_1||=||M^{-1}h_2|| \\ & r_1 = \lambda M^{-1}h_1 \\ & r_2 = \lambda M^{-1}h_2 \\ & r_3 = r_1 \times r_2 \\ & t = \lambda M^{-1}h_3 \end{aligned} \right. ⎩⎨⎧s=∣∣M−1h1∣∣=∣∣M−1h2∣∣r1=λM−1h1r2=λM−1h2r3=r1×r2t=λM−1h3
需要注意的是,上述的推导结果是基于理想情况下的解,从理论上证明了张氏标定算法的可行性。
