ORB-SLAM2源码学习:Initializer.cc(12): Initializer::DecomposeE分解本质矩阵得到R,t

前言

这部分函数通过对输入的本质矩阵E进行SVD分解得到的左奇异值矩阵的最后一列作为平移向量t,在通过构造一个绕Z旋转pi/2的旋转矩阵来构建旋转矩阵R。

这部分实际上已经固定了求解模式我这里仅仅是做了一些简单的了解。

1.函数声明

void Initializer::DecomposeE(const cv::Mat &E, cv::Mat &R1, cv::Mat &R2, cv::Mat &t)

2.函数定义

1.对本质矩阵进行SVD分解

  // 对本质矩阵进行奇异值分解
	//准备存储对本质矩阵进行奇异值分解的结果
    cv::Mat u,w,vt;
	//对本质矩阵进行奇异值分解
    cv::SVD::compute(E,w,u,vt);

2.将左奇异值矩阵最后一列作为平移向量并归一化

// 左奇异值矩阵U的最后一列就是t,对其进行归一化
    u.col(2).copyTo(t);
    t=t/cv::norm(t);

3.构造一个绕Z旋转pi/2的旋转矩阵来构建旋转矩阵R。

 // 构造一个绕Z轴旋转pi/2的旋转矩阵W,按照下式组合得到旋转矩阵 R1 = u*W*vt
    //计算完成后要检查一下旋转矩阵行列式的数值,使其满足行列式为1的约束
    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;

4.利用行列式为1的约束来构造不同的的旋转矩阵R

//计算
    R1 = u*W*vt;
	//旋转矩阵有行列式为+1的约束,所以如果算出来为负值,需要取反
    if(cv::determinant(R1)<0) 
        R1=-R1;

	// 同理将矩阵W取转置来按照相同的公式计算旋转矩阵R2 = u*W.t()*vt

    R2 = u*W.t()*vt;
	//旋转矩阵有行列式为1的约束
    if(cv::determinant(R2)<0)
        R2=-R2;

结束语

以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值