跟六哥学习ORB-SLAM2作业(二)下

本文探讨了ORB_SLAM中进行特征点均匀化的重要性,介绍了GMS方法在特征匹配中的应用,并详细阐述了如何实现单目相机SLAM的初始化流程,包括特征提取、GMS筛选、位姿估计与三角化,以及外点剔除原因的分析。
摘要由CSDN通过智能技术生成

目录

5、(问答题)  ORB_SLAM中为什么要进行特征点的均匀化?有什么好处?请调研至少1种以上其他可以实现均匀化的方法?

6、(问答题)  题目:单目相机SLAM是视觉SLAM所需最小的配置,应用非常广泛,而其中单目初始化尤其重要。这里我们自己实现了一个单目相机初始化流程,包括:提取特征点,特征匹配和筛选,位姿估计,三角化。代码框架已经写好了,推荐环境:ubuntu 18.04, OpenCV 3.4.6。


5、(问答题)  ORB_SLAM中为什么要进行特征点的均匀化?有什么好处?请调研至少1种以上其他可以实现均匀化的方法?

有人对该问题做了实验对比:https://blog.csdn.net/yong_qi2015/article/details/106700580

好处可以总结为:避免特征点扎推,最终能提高建图和定位精度

四叉树均匀化

 

6、(问答题)  题目:单目相机SLAM是视觉SLAM所需最小的配置,应用非常广泛,而其中单目初始化尤其重要。这里我们自己实现了一个单目相机初始化流程,包括:提取特征点,特征匹配和筛选,位姿估计,三角化。代码框架已经写好了,推荐环境:ubuntu 18.04, OpenCV 3.4.6。

任务1

需要你在缺失的两个地方补充如下代码:

第1处:在 feature_match 函数中:

// ---------- homework1:用GMS方法筛选暴力匹配结果中正确的匹配对 --------------//
    // ----------------  代码开始 -----------------//
    std::vector<bool> vbInliers;
    int num_inliers;

    gms_matcher gms(keypoints_1, img_1.size(), keypoints_2, img_2.size(), Matches_bf);
    num_inliers = gms.GetInlierMask(vbInliers, false, false);
    cout << "Get total " << num_inliers << " matches." << endl;

    // collect matches
    for (size_t i = 0; i < vbInliers.size(); ++i)
    {
        if (vbInliers[i] == true)
        {
            matches_gms.push_back(Matches_bf[i]);
        }
    }
    // ----------------  代码结束-----------------//

答:

1.参数的初始化

2.确定第一帧图像,后续以此帧相机坐标系为世界坐标系

3.依次对后续每一帧进行特征点提取,匹配,筛选,三角化等操作,直到可以找到可以初始化的那一帧结束

3.1.对每一帧进行特征点提取

3.2.使用GMS方法对暴力匹配的结果进行筛选

3.3.根据筛选后的匹配点对进行位姿估计

3.4.根据估计的位姿,以及匹配点对关系,三角化空间点

3.5.对空间点进行重投影检验,提出误差较大的匹配对

3.6.对空间点进行观察角度检验,提出观察角度小于设定角度的点

3.7.检查剩余的点数以及角度关系是否满足要求,满足则初始化完成,不满足则使用下一张进行初始化

4.绘制内外点匹配点对,绘制内外点的重投影

这一处主要是找到GMS的论文和代码就行了!

【参考】

https://blog.csdn.net/zhangjunhit/article/details/77891666

https://blog.csdn.net/custesc/article/details/103963787

https://github.com/JiawangBian/GMS-Feature-Matcher

第2处:在 triangulation 函数中:

// ---------- homework2:筛选内外点,参考ORB-SLAM2中单目初始化代码实现 --------//
// ----------------  代码开始 -----------------//
// 根据重投影误差筛选内外点
vector<int> inlier3dPoints;
//...

int sum = std::accumulate(inlier3dPoints.begin(), inlier3dPoints.end(), 0);
printf("经过重投影误差筛选后,有效3D点数为:%d / %d \n", sum, inlier3dPoints.size());

// 根据三角化夹角来筛选合格的三维点
vector<double> cosinPts;
//...
printf("经过角度筛选后,有效3D点数为: %d / %d \n",cosinPts.size() , inlier3dPoints.size());
// ----------------  代码结束 -----------------//

答:与ORB-SLAM2代码差在给的数据类型上,没有做出来,等讲解学习吧!

任务2

根据运行结果分析外点被删除的原因。
 

答:在ORB-SLAM2代码中,剔除匹配对的情况有:

  • 三角化的三维点坐标不合法(无穷值)
  • 通过三维点深度值正负、两相机光心视差角大小来检查不合法(负值不合法,视差比较小时,重投影误差较大不合法)

  • 计算空间点在参考帧和当前帧上的重投影误差,如果大于阈值则舍弃

题目代码下载:

链接:https://pan.baidu.com/s/1AznfTbMULCBtEt5PqK7Nfw 

提取码:d4n5

提交作业请通过百度网盘压缩包上传可以编译的完整代码,设置永久链接,方便批改,谢谢

【参考】

https://blog.csdn.net/zhangjunhit/article/details/77891666

https://blog.csdn.net/custesc/article/details/103963787

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值