从本质矩阵恢复相机矩阵

xiaoxiao2021-02-28  39

本质矩阵

本质矩阵(essential matrix )是基本矩阵在归一化图像坐标下的一种特殊形式。

考虑相机矩阵 P = K [ R ∣ t ] P=K[R|\mathbf t] P=K[Rt],点 x = P X \mathbf x=P\mathbf X x=PX是图像平面上的一个点,若已知相机内参 K K K,那么点 x ^ = K − 1 x \mathbf{\hat x}=K^{-1}\mathbf x x^=K1x,有 x ^ = [ R ∣ t ] X \mathbf{\hat x}=[R|\mathbf t]\mathbf X x^=[Rt]X,则称点 x ^ \mathbf{\hat x} x^是在归一化坐标(normalized coordinates )下的表示。点 x ^ \mathbf{\hat x} x^可以被认为是空间点 X \mathbf X X在内参矩阵为单位阵 I I I的情况下的像,而 K − 1 P = [ R ∣ t ] K^{-1}P=[R|\mathbf t] K1P=[Rt]称为归一化相机矩阵(normalized camera matrix )。

对于一对对应点 x ↔ x ′ \mathbf x\leftrightarrow\mathbf x' xx基本矩阵定义为 x ′ F x = 0 (1) \mathbf x'F\mathbf x=0\tag{1} xFx=0(1)   而对本质矩阵,给定一对对应点 x ↔ x ′ \mathbf x\leftrightarrow\mathbf x' xx,归一化图像点对为 x ^ ↔ x ^ ′ \mathbf{\hat x}\leftrightarrow\mathbf{\hat x'} x^x^,定义为 x ^ ′ T E x ^ = 0 (2) \mathbf{\hat x'}^TE\mathbf{\hat x}=0\tag{2} x^TEx^=0(2)   把点对应关系 x ^ = K − 1 x \mathbf{\hat x}=K^{-1}\mathbf{x} x^=K1x,和 x ^ ′ = K ′ − 1 x ′ \mathbf{\hat x'}=K'^{-1}\mathbf{x'} x^=K1x代入(2)可以得到 x ′ T K ′ − T E K − 1 x = 0 \mathbf{ x'}^TK'^{-T}EK^{-1}\mathbf{x}=0 xTKTEK1x=0,则有如下关系 E = K ′ T F K (3) E=K'^TFK\tag{3} E=KTFK(3)   考虑相机矩阵 P = K [ I ∣ 0 ] P=K[I|\mathbf 0] P=K[I0] P ′ = [ R ∣ t ] P'=[R|\mathbf t] P=[Rt],根据 F F F矩阵的性质有 F = K ′ − T [ t ] × R K − 1 = K ′ − T R [ R T t ] × K − 1 (4) F=K'^{-T}[\mathbf t]_{\times}RK^{-1}=K'^{-T}R[R^{T}\mathbf t]_{\times}K^{-1}\tag{4} F=KT[t]×RK1=KTR[RTt]×K1(4)   从而有 E = [ t ] × R = R [ R T t ] × (5) E=[\mathbf t]_{\times}R=R[R^{T}\mathbf t]_{\times}\tag{5} E=[t]×R=R[RTt]×(5)

本质矩阵的性质

其中 t \mathbf t t R R R分别有 3 3 3个自由度,除去一个齐次因子, E E E只有 5 5 5个自由度,因此需要满足比 F F F矩阵更多的约束。

反对称矩阵的性质

如果一个矩阵 M M M d × d d\times d d×d的反对称矩阵(skew-symmetric/antisymmetric matrices),那么其满足 M T = − M M^T=-M MT=M,有 det ⁡ M = det ⁡ ( − M T ) = det ⁡ ( − M ) = ( − 1 ) d det ⁡ M (6) \det M=\det(-M^T)=\det(-M)=(-1)^d\det M\tag{6} detM=det(MT)=det(M)=(1)ddetM(6)   可以观察到,当 d d d为奇数时, det ⁡ M = 0 \det M=0 detM=0。所以,反对称矩阵 M M M的秩一定为偶数。

如果 M M M的维度为偶数的非奇异 2 n × 2 n 2n\times 2n 2n×2n反对称矩阵,那么,存在正交矩阵 U U U,有 U T M U = N ≡ diag { ( 0 m 1 − m 1 0 ) , ( 0 m 2 − m 2 0 ) , . . . , ( 0 m n − m n 0 ) } (7) U^TMU=N\equiv \text{diag} \begin{Bmatrix} \begin{pmatrix}0&m_1\\-m_1&0\end{pmatrix}, \begin{pmatrix}0&m_2\\-m_2&0\end{pmatrix}, ..., \begin{pmatrix}0&m_n\\-m_n&0\end{pmatrix} \end{Bmatrix}\tag{7} UTMU=Ndiag{(0m1m10),(0m2m20),...,(0mnmn0)}(7)   这里的 m j m_j mj都是正实数。矩阵 N N N称为非奇异反对称矩阵的实标准型(real normal form)。如果矩阵 M M M是奇异的且秩为 2 n 2n 2n d × d d\times d d×d矩阵( d d d可以是奇数可以是偶数),则存在 d × d d\times d d×d矩阵 U U U使得

U T M U = N ≡ diag { ( 0 m 1 − m 1 0 ) , ( 0 m 2 − m 2 0 ) , . . . , ( 0 m n − m n 0 ) , O d − 2 n } (8) U^TMU=N\equiv \text{diag} \begin{Bmatrix} \begin{pmatrix}0&m_1\\-m_1&0\end{pmatrix}, \begin{pmatrix}0&m_2\\-m_2&0\end{pmatrix}, ..., \begin{pmatrix}0&m_n\\-m_n&0\end{pmatrix}, O_{d-2n} \end{Bmatrix}\tag{8} UTMU=Ndiag{(0m1m10),(0m2m20),...,(0mnmn0),Od2n}(8)   这里的 O d − 2 n O_{d-2n} Od2n是一个 ( d − 2 n ) × ( d − 2 n ) (d-2n)\times(d-2n) (d2n)×(d2n)的零矩阵,当 d = 2 n d=2n d=2n ( 8 ) (8) (8)式退化为 ( 7 ) (7) (7)式。

综上所述,实反对称矩阵 M M M可以分解为 M = U N U T M=UNU^T M=UNUT的形式, U U U为正交矩阵,其中 N N N是形如 diag ( m 1 D , m 2 D , . . . , m n D , 0 , . . . , 0 ) T \text{diag}(m_1D,m_2D,...,m_nD,0,...,0)^T diag(m1D,m2D,...,mnD,0,...,0)T的分块矩阵,其中 D = [ 0 1 − 1 0 ] D=\begin{bmatrix}0&1\\-1&0\end{bmatrix} D=[0110]

本质矩阵的性质

本质矩阵 E = [ t ] × R = S R E=[\mathbf t]_{\times}R=SR E=[t]×R=SR,我们考虑 3 × 3 3\times3 3×3反对称矩阵 S S S,其可表示为 S = k U Z U T S=kUZU^T S=kUZUT,根据上述的反对称矩阵的性质, 3 × 3 3\times3 3×3的反对称矩阵 det ⁡ S = 0 \det S=0 detS=0,对应上述 d = 3 d=3 d=3 n = 1 n=1 n=1的情况,则矩阵 Z Z Z可以表示为 Z = [ 0 1 0 − 1 0 0 0 0 0 ] Z=\begin{bmatrix} 0&1&0\\ -1&0&0\\ 0&0&0 \end{bmatrix} Z=010100000   在相差一个尺度因子的情况下, E = U Z U T R E=UZU^TR E=UZUTR。为把矩阵 E E E写成奇异值分解 E = U Σ V T E=U\Sigma V^T E=UΣVT的形式,则需要把 Z Z Z构造为一个对角矩阵和正交矩阵相乘的形式。根据初等行变换 [ Z ∣ I ] = [ 0 1 0 1 0 0 − 1 0 0 0 1 0 0 0 0 0 0 1 ] ⇒ [ 1 0 0 0 − 1 0 0 1 0 1 0 0 0 0 0 0 0 1 ] = [ diag ( 1 , 1 , 0 ) ∣ W ] [Z|I]= \left[ \begin{array}{ccc|ccc} 0&1&0&1&0&0\\ -1&0&0&0&1&0\\ 0&0&0&0&0&1 \end{array}\right] \Rightarrow \left[ \begin{array}{ccc|ccc} 1&0&0&0&-1&0\\ 0&1&0&1&0&0\\ 0&0&0&0&0&1 \end{array}\right]=[\text{diag}(1,1,0)|W] [ZI]=010100000100010001100010000010100001=[diag(1,1,0)W]   观察到这里的 W W W是一个正交矩阵且 W − 1 = W T W^{-1}=W^T W1=WT,有 Z W = diag ( 1 , 1 , 0 ) Z W T = − diag ( 1 , 1 , 0 ) (9) \begin{aligned} ZW&=\text{diag}(1,1,0)\\ ZW^T&=-\text{diag}(1,1,0) \end{aligned}\tag{9} ZWZWT=diag(1,1,0)=diag(1,1,0)(9)   因此本质矩阵的奇异值分解可以表示为 E = U Z U T R = U diag ( 1 , 1 , 0 ) ( W T U T R ) ≡ U diag ( 1 , 1 , 0 ) V 1 T E = U Z U T R = U diag ( 1 , 1 , 0 ) ( − W U T R ) ≡ U diag ( 1 , 1 , 0 ) V 2 T (10) \begin{aligned} E&=UZU^TR=U\text{diag}(1,1,0)(W^TU^TR)\equiv U\text{diag}(1,1,0) V_1^T\\ E&=UZU^TR=U\text{diag}(1,1,0)(-WU^TR)\equiv U\text{diag}(1,1,0) V_2^T \end{aligned}\tag{10} EE=UZUTR=Udiag(1,1,0)(WTUTR)Udiag(1,1,0)V1T=UZUTR=Udiag(1,1,0)(WUTR)Udiag(1,1,0)V2T(10)

所以本质矩阵分解有两种情况,但都有如下形式 E = U diag ( 1 , 1 , 0 ) V T (11) E=U\text{diag}(1,1,0) V^T\tag{11} E=Udiag(1,1,0)VT(11)   并且我们有如下结论(性质)

一个矩阵是本质矩阵的充要条件是其奇异值中有两个相等且第三个是 0 0 0

本质矩阵的分解

我们希望通过本质矩阵的SVD分解得到 R R R t \mathbf t t。考虑本质矩阵两个SVD分解的情况,如果我们通过SVD分解得到 E = U Σ V T = U diag ( 1 , 1 , 0 ) V T E=U\Sigma V^T=U\text{diag}(1,1,0) V^T E=UΣVT=Udiag(1,1,0)VT   设 E = S R E=SR E=SR S S S的形式和上述相同 S = U Z U T S=UZU^T S=UZUT,则分解得到的旋转矩阵可以记为 R = U X V T R=UXV^T R=UXVT,这里的 X X X是某个旋转矩阵。则有 U diag ( 1 , 1 , 0 ) V T = E = S R = ( U Z U T ) ( U X V T ) = U ( Z X ) V T U\text{diag}(1,1,0) V^T=E=SR=(UZU^T)(UXV^T)=U(ZX)V^T Udiag(1,1,0)VT=E=SR=(UZUT)(UXVT)=U(ZX)VT   因此有 Z X = diag ( 1 , 1 , 0 ) ZX=\text{diag}(1,1,0) ZX=diag(1,1,0),从而有 X = W X=W X=W或者 X = W T X=W^T X=WT,因此旋转矩阵 R R R有如下两种情况 R 1 = U W T V T R 2 = U W V T (12) \begin{aligned} R_1=UW^TV^T&&R_2=UWV^T\\ \end{aligned}\tag{12} R1=UWTVTR2=UWVT(12)   这里回顾 ( 10 ) (10) (10)式,由于 R R R为旋转矩阵,则有 det ⁡ R = 1 \det R=1 detR=1,因此 ( 10 ) (10) (10)式中 det ⁡ V 1 = det ⁡ ( R T U W ) = det ⁡ ( R T ) det ⁡ ( U ) det ⁡ ( W ) = det ⁡ ( U ) \det V_1=\det(R^TUW)=\det(R^T)\det(U)\det(W)=\det(U) detV1=det(RTUW)=det(RT)det(U)det(W)=det(U),则有 det ⁡ ( U V ) = 1 \det(UV)=1 det(UV)=1,而对于 det ⁡ V 2 = det ⁡ ( − R T U W T ) = − d e t ( U ) \det V_2=\det(-R^TUW^T)=-det(U) detV2=det(RTUWT)=det(U),则有 det ⁡ ( U V ) = − 1 \det(UV)=-1 det(UV)=1,所以对应于 det ⁡ ( U V ) = − 1 \det(UV)=-1 det(UV)=1的情况, ( 12 ) (12) (12)式中求得的旋转矩阵的行列式就为 − 1 -1 1,所以在结果中需要取反。      接下来我们考虑 t \mathbf t t,根据 E = [ t ] × R = S R E=[\mathbf t]_{\times}R=SR E=[t]×R=SR,即我们从 S = [ t ] × S=[\mathbf t]_\times S=[t]×中得到 t \mathbf t t,考虑 S t = [ t ] × t = 0 S\mathbf t=[\mathbf t]_\times \mathbf t=0 St=[t]×t=0   则 t \mathbf t t属于 S S S的零空间,通过对前两行的线性变换,可以把式子化为奇异值分解的形式,而考虑到Z的最后一行为零,也就是对应了最小奇异值(0),因而解就是 t = U ( 0 , 0 , 1 ) T = u 3 \mathbf t=U(0,0,1)^T=\mathbf u_3 t=U(0,0,1)T=u3,即 U U U最后一列。考虑到给 t \mathbf t t乘以一个非零尺度因子得 λ t \lambda\mathbf t λt,有 [ λ t ] × R = λ [ t ] × R = λ E [\lambda\mathbf t]_{\times}R=\lambda[\mathbf t]_{\times}R=\lambda E [λt]×R=λ[t]×R=λE,而对于 E E E而言(相差一个尺度因子)这种情况也是等效的,而对于 t \mathbf t t而言,当 λ = ± 1 \lambda=\pm1 λ=±1时,其物理上的意义(方向)却是不同的。所以,不考虑尺度因子,即取 ∥ t ∥ = 1 \|\mathbf t\|=1 t=1 t \mathbf t t的方向依然无法确定,所以有两种可能的解。

综上,本质矩阵的分解一共有 4 4 4种可能的解,即已知本质矩阵 E = U diag ( 1 , 1 , 0 ) V T E=U\text{diag}(1,1,0) V^T E=Udiag(1,1,0)VT和第一个相机矩阵 P = [ I ∣ 0 ] P=[I|\mathbf 0] P=[I0],则第二个相机矩阵 P ′ P' P有如下 4 4 4四种可能的解 P ′ = [ U W V T ∣ u 3 ] or [ U W T V T ∣ u 3 ] ( λ = 1 ) [ U W V T ∣ − u 3 ] or [ U W T V T ∣ − u 3 ] ( λ = − 1 ) (13) \begin{aligned} P'=[UWV^T|\mathbf u_3] && \text{or}&&[UW^TV^T|\mathbf u_3] && (\lambda=1)\\ [UWV^T|-\mathbf u_3] && \text{or}&&[UW^TV^T|-\mathbf u_3] && (\lambda=-1) \end{aligned}\tag{13} P=[UWVTu3][UWVTu3]oror[UWTVTu3][UWTVTu3](λ=1)(λ=1)(13)   下图的四种情况就是上述四种解对应的两个相机之间的关系。其实这四种情况中只有一种是符合实际的解,只需要根据上述的解根据三角法去计算3D点的坐标,只有当两个相机观测到3D点都在前方,也就是深度都为正,才是最终的解。

下面的是ORB-SLAM2中本质矩阵分解的代码

void Initializer::DecomposeE(const cv::Mat &E, cv::Mat &R1, cv::Mat &R2, cv::Mat &t) { cv::Mat u,w,vt; cv::SVD::compute(E,w,u,vt); u.col(2).copyTo(t); t=t/cv::norm(t); cv::Mat W(3,3,CV_32F,cv::Scalar(0)); W.at<float>(0,1)=-1; W.at<float>(1,0)=1; W.at<float>(2,2)=1; R1 = u*W*vt; if(cv::determinant(R1)<0) R1=-R1; R2 = u*W.t()*vt; if(cv::determinant(R2)<0) R2=-R2; }

以及OpenCV中的代码

void cv::decomposeEssentialMat( InputArray _E, OutputArray _R1, OutputArray _R2, OutputArray _t ) { Mat E = _E.getMat().reshape(1, 3); CV_Assert(E.cols == 3 && E.rows == 3); Mat D, U, Vt; SVD::compute(E, D, U, Vt); if (determinant(U) < 0) U *= -1.; if (determinant(Vt) < 0) Vt *= -1.; Mat W = (Mat_<double>(3, 3) << 0, 1, 0, -1, 0, 0, 0, 0, 1); W.convertTo(W, E.type()); Mat R1, R2, t; R1 = U * W * Vt; R2 = U * W.t() * Vt; t = U.col(2) * 1.0; R1.copyTo(_R1); R2.copyTo(_R2); t.copyTo(_t); }

之后对四个解做判断的代码在这里,篇幅过长则不贴出

ORB-SLAM2,主要在CheckRT这个函数OpenCV

参考

Multipe View Geometry in Computer Vision II, 9.6

Properties of antisymmetric matrices

Camera Computation and the Essential Matrix

转载请注明原文地址: https://www.6miu.com/read-74918.html

最新回复(0)