本质矩阵分解

定义spa

 本质矩阵是归一化图像坐标下的基本矩阵的特殊形式code

E=t^Rorm


 

性质blog

一个 3X3 矩阵是本质矩阵的充要条件是它的奇异值中有两个相等而第三个是 0ip

证实: 正交矩阵$W=\begin{bmatrix}1&-1&0\\1&0&0\\0&0&1\end{bmatrix}$    反对称矩阵$Z=\begin{bmatrix}0&-1&0\\1&0&0\\0&0&0\end{bmatrix}$  it

其中t^R转换成矩阵形式为t^R, S是反对称矩阵,E=SR.io

根据定义:class

  S=kUZUT   ,U是正交矩阵。float

  Z=diag(1,1,0)W方法

  得S=kUdiag(1,1,0)WUT, 忽略尺度时视k=1

由SVD分解E可得

   E=Udiag(1,1,0)VT=SR

在相差一个常数k的意义下,

  E=SR=Udiag(1,1,0)WUTR=Udiag(1,1,0)VT

  故WUTR=V

这正是E的奇异值分解并如所须要证实的具备两个相等的奇异值,反之,一个具备两个相同奇异值的矩阵能够用一样方法分解为 SR.


分解

 (1)若E可由SVD分解为E=Udiag(1,0,0)VTR和 t有四种分解的状况

其中R 有两种状况;

  因为 

  E=SR=Udiag(1,1,0)VT=Udiag(1,1,0)WUTR

 

  即  WUTR=VT  ,  其中 R ,   W,  U   ,V 为正交矩阵 

  得      R=UWVT    or  UWTV    其中U V 是E经过SVD分解出的  W 是前面说起的反对称矩阵  ;

       当R=UWTVT    时为负号

证实

  E=SR=(UZUT)(UXVT)   ,x是正交矩阵,旋转矩阵,

    =U(ZX)VT=Udiag(1,0,0)VT

  故ZX=diag(1,1,0)

由于X是旋转矩阵,因此x= W

当 x=WT     得  ZX=diag(-1,-1,0)         忽略符号 -->      ZX=diag(1,1,0)

 

(2)己知本质矩阵 E=Udiag(1,1,0)VT和前一个相机位置矩阵P[R |t ], 那么第二个像机矩阵 P'[R |t ] 有下列几种可能的选择:

  P'2=[UWVT|u3]  or  [UWVT|u3 ]  or  [UWTVT|u3]  or  [UWTVT|u3]

  即 t取U的最后一列

 

R部分上面已证实 t部分证实以下

 

S的F范数的平方为2,意味着若是S=t^(包含尺度因子) ,则 ιι ιι=1,这是对两个摄像机矩阵基线的一种经常使用的归一化

由叉乘性质得

  St=0

 


 

不严谨推导

利用最小二乘思想(SVD分解求方程组相似)

  min  ιι St ιι  ,   st  ιι ιι=1

  ιι St ιι  = tTSTSt

    =σ  ιι ιι

 

STS的最小特征值对应的特征向量为最优解

  STS=UZTUTUZUT

    =UTZTZUT

    =UTdiag(1,1,0)UT

 

其中U为S的特征向量 ,取最后一行为最小解

即  Su=oS       ,u为S最小特征值对应的特征向量,此时Su 最小

 


 

 代码 

from orbslam2

 1 /**  2  * @brief 分解Essential矩阵  3  *  4  * F矩阵经过结合内参能够获得Essential矩阵,分解E矩阵将获得4组解 \n  5  * 这4组解分别为[R1,t],[R1,-t],[R2,t],[R2,-t]  6  * @param E Essential Matrix  7  * @param R1 Rotation Matrix 1  8  * @param R2 Rotation Matrix 2  9  * @param t Translation 10  * @see Multiple View Geometry in Computer Vision - Result 9.19 p259 chinese 174 11  */
12 void Initializer::DecomposeE(const cv::Mat &E, cv::Mat &R1, cv::Mat &R2, cv::Mat &t) { 13  Mat u, w, vt; 14  SVDecomp(E, w, u, vt); 15     //t为 u的最后一行
16     u.col(2).copyTo(t); 17     t /= norm(t); 18 
19     Mat W(3, 3, CV_32F, cv::Scalar(0)); 20     W.at<float>(0, 1) = -1; 21     W.at<float>(1, 0) = 1; 22     W.at<float>(2, 2) = 1; 23 
24     R1 = u * W * vt; 25     if (cv::determinant(R1) < 0)// 旋转矩阵有行列式为1的约束
26         R1 = -R1; 27 
28     R2 = u * W.t() * vt; 29     if (cv::determinant(R2) < 0) 30         R2 = -R2; 31 
32 }

 

 

 参考  《计算机视觉中的多视图几何》

相关文章
相关标签/搜索