通过前两章我们已经把相机标定从获取数据到求解投影矩阵再到求解具体参数的过程都讲解完了,具体内容可以参考以下链接:从零开始的三维重建(三)—— 相机标定(下)。这一部分我们再说一些有关相机标定计算的补充内容。
SVD奇异值分解
我们先说SVD的定义:
对于任意实数矩阵A∈R m × n ^{m×n} m×n,其奇异值分解为:
A = U Σ V T A=UΣV^T A=UΣVT
其中:
U∈R m × m ^{m×m} m×m是正交矩阵(列向量称为左奇异向量)
Σ∈R m × n ^{m×n} m×n是对角矩阵,对角线元素为奇异值(按降序排列)
V∈R n × n ^{n×n} n×n是正交矩阵(列向量称为右奇异向量)
之所以我们要做奇异值分解,原因是因为对于一个正定矩阵,如果我们想分析它的特征值和特征向量,可以对其进行分解成为QΣQ T ^T T的形式,其中Q是特征向量形成的矩阵,而Σ是对角矩阵,即原始矩阵的特征值。但当矩阵不是方阵的时候,上述做法是行不通的,因为该矩阵没有特征值的概念,因此就出现了SVD奇异值分解。
SVD计算过程
1、首先我们计算A T ^T TA和AA T ^T T,其中A T ^T TA 是n×n 的对称矩阵,其特征值为非负实数,而AA T ^T T是m×m的对称矩阵,特征值同样为非负实数。
2、求A T ^T TA的特征向量和特征值,我们对A T ^T TA进行特征分解,得到的特征值λ从1到n按照降序排序,对应的特征向量v1到n构成正交矩阵V。
3、确定奇异值,奇异值σ= λ \sqrt{λ} λ,并按照降序排列构成对角矩阵Σ。
4、构造矩阵U,对每个非零奇异值σ,计算u=Av/σ,若m>n则补充U的剩余列向量使其成为正交矩阵
SVD计算示例
假设我们的矩阵如下:
A = [ 1 1 0 1 1 0 ] A=\begin{bmatrix} 1 & 1 \\ 0 & 1 \\ 1 & 0 \end{bmatrix} A=
101110
首先第一步我们计算A T ^T TA和AA T ^T T:
A T A = [ 1 0 1 1 1 0 ] [ 1 1 0 1 1 0 ] = [ 2 1 1 2 ] A A T = [ 1 1 0 1 1 0 ] [ 1 0 1 1 1 0 ] = [ 2 1 1 1 1 0 1 0 1 ] A^TA=\begin{bmatrix} 1 & 0 & 1 \\ 1 & 1 & 0 \end{bmatrix}\begin{bmatrix} 1 & 1 \\ 0 & 1 \\ 1 & 0 \end{bmatrix}=\begin{bmatrix} 2 & 1 \\ 1 & 2 \end{bmatrix}\\ AA^T=\begin{bmatrix} 1 & 1 \\ 0 & 1 \\ 1 & 0 \end{bmatrix}\begin{bmatrix} 1 & 0 & 1 \\ 1 & 1 & 0 \end{bmatrix}=\begin{bmatrix} 2 & 1 & 1 \\ 1 & 1 & 0 \\ 1 & 0 & 1 \end{bmatrix} ATA=[110110]
101110
=[2112]AAT=
101110
[110110]=
211110101
然后我们再求解A T ^T TA的特征向量,即det(A T ^T TA-λI)=0:
d e t ( [ 2 − λ 1 1 2 − λ ] ) = ( 2 − λ ) 2 − 1 = 0 det(\begin{bmatrix} 2-λ & 1 \\ 1 & 2-λ \end{bmatrix})=(2-λ)^2-1=0 det([2−λ112−λ])=(2−λ)2−1=