本质矩阵分解和基础矩阵的区别是什么

基础矩阵F和单应矩阵H的区别? - 知乎12被浏览1802分享邀请回答41 条评论分享收藏感谢收起本质矩阵和基础矩阵的区别是什么? - 知乎112被浏览12801分享邀请回答556 条评论分享收藏感谢收起12880人阅读
OpenCV(51)
(1)Essential Matrix
如上图所示,给定一个目标点P,以左摄像头光心Ol为原点。点P相对于光心Ol的观察位置为Pl,相对于光心Or的观察位置为Pr。点P在左摄像头成像平面上的位置为pl,在右摄像头成像平面上的位置为pr。注意Pl、Pr、pl、pr
都处于摄像机坐标系,其量纲是与平移向量T相同的(pl、pr
在图像坐标系中对应的像素坐标为 ql、qr
假设右摄像头相对于左摄像头的相对位置关系由旋转矩阵R和平移向量T表示,则可得:Pr = R(Pl-T)。
现在我们要寻找由点P、Ol和Or确定的对极平面的表达式。注意到平面上任意一点x与点a的连线垂直于平面法向量n,即向量 (x-a) 与向量 n 的点积为0:(x-a)·n = 0。在Ol坐标系中,光心Or的位置为T,则P、Ol和Or确定的对极平面可由下式表示:(Pl-T)T·(Pl×T) = 0。
由 = R(Pl-T) 和 RT=R-1 可得:(RTPr)T·(Pl×T) = 0。
另一方面,向量的叉积又可表示为矩阵与向量的乘积,记向量T的矩阵表示为S,得:Pl×T = SPl。
那么就得到:(Pr)TRSPl = 0。这样,我们就得到Essential Matrix:E = RS。
通过矩阵E我们知道Pl和Pr的关系满足:(Pr)TEPl = 0。进一步地,由 pl = fl*Pl/Zl 和 pr = fr*Pr/Zr 我们可以得到点P在左右两个摄像机坐标系中的观察点 pl
和 pr 应满足的极线约束关系为:(pr)TEpl = 0。
注意到 E 是不满秩的,它的秩为2,那么 (pr)TEpl = 0 表示的实际上是一条直线,也就是对极线。
(2)Fundamental Matrix
由于矩阵E并不包含摄像头内参信息,且E是面向摄像头坐标系的。实际上我们更感兴趣的是在图像像素坐标系上去研究一个像素点在另一视图上的对极线,这就需要用到摄像机的内参信息将摄像头坐标系和图像像素坐标系联系起来。在(1)中,pl和pr是物理坐标值,对应的像素坐标值为ql和qr,摄像头内参矩阵为M,则有:p=M-1q。从而:(pr)TEpl
= 0 à qrT(Mr-1)TE Ml-1ql = 0。这里,我们就得到Fundamental Matrix:F = (Mr-1)TE Ml-1。并有 qrTFql
(3)OpenCV的相关计算
由上面的分析可见,求取矩阵E和F关键在于旋转矩阵R和平移向量T的计算,而Calibrate的代码中大部分(cvcalibration.cpp的第行)也是计算和优化R和T的。在的第行给出了计算R和T初始估计值的基本方法:
Compute initial estimate of pose
For each image, compute:
R(om) is the rotation matrix of om
om(R) is the rotation vector of R
R_ref = R(om_right) * R(om_left)'
T_ref_list = [T_ref_ T_right - R_ref * T_left]
om_ref_list = {om_ref_ om(R_ref)]
om = median(om_ref_list)
T = median(T_ref_list)
具体的计算过程比较繁杂,不好理解,这里就不讨论了,下面是计算矩阵E和F的代码:
if( matE || matF )
double* t = T_LR.data.
double tx[] =
<span style="color:#, -t[<span style="color:#], t[<span style="color:#],
t[<span style="color:#], <span style="color:#, -t[<span style="color:#],
-t[<span style="color:#], t[<span style="color:#], <span style="color:#
CvMat Tx = cvMat(<span style="color:#, <span style="color:#, CV_64F, tx);
double e[<span style="color:#], f[<span style="color:#];
CvMat E = cvMat(<span style="color:#, <span style="color:#, CV_64F, e);
CvMat F = cvMat(<span style="color:#, <span style="color:#, CV_64F, f);
cvMatMul( &Tx, &R_LR, &E );
if( matE )
cvConvert( &E, matE );
if( matF )
double ik[<span style="color:#];
CvMat iK = cvMat(<span style="color:#, <span style="color:#, CV_64F, ik);
cvInvert(&K[<span style="color:#], &iK);
cvGEMM( &iK, &E, <span style="color:#, <span style="color:#, <span style="color:#, &E, CV_GEMM_A_T );
cvInvert(&K[<span style="color:#], &iK);
cvMatMul(&E, &iK, &F);
cvConvertScale( &F, matF, fabs(f[<span style="color:#]) & <span style="color:# ? <span style="color:#./f[<span style="color:#] : <span style="color:# );
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:538471次
积分:6794
积分:6794
排名:第3568名
原创:100篇
转载:231篇
译文:42篇
评论:38条
(7)(2)(3)(1)(1)(1)(10)(5)(1)(5)(10)(1)(2)(2)(2)(4)(1)(2)(13)(4)(6)(3)(6)(24)(20)(16)(4)(30)(26)(28)(21)(35)(9)(8)(18)(1)(19)(10)(7)(4)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 矩阵的本质是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信