ORB-SLAM2 --- Tracking::SearchLocalPoints函数解析

news2024/11/24 11:02:34

1.函数作用

        用局部地图点进行投影匹配,得到更多的匹配关系。

        局部地图点中已经是当前帧地图点的不需要再投影,只需要将此外的并且在视野范围内的点和当前帧进行投影匹配。

2.函数流程 

Step 1:遍历当前帧的地图点,标记这些地图点不参与之后的投影搜索匹配

Step 2:判断所有局部地图点中除当前帧地图点外的点,是否在当前帧视野范围内

Step 3:如果需要进行投影匹配的点的数目大于0,就进行投影匹配,增加更多的匹配关系

3.code 

void Tracking::SearchLocalPoints()
{
    // Do not search map points already matched
    // Step 1:遍历当前帧的地图点,标记这些地图点不参与之后的投影搜索匹配
    for(vector<MapPoint*>::iterator vit=mCurrentFrame.mvpMapPoints.begin(), vend=mCurrentFrame.mvpMapPoints.end(); vit!=vend; vit++)
    {
        MapPoint* pMP = *vit;
        if(pMP)
        {
            if(pMP->isBad())
            {
                *vit = static_cast<MapPoint*>(NULL);
            }
            else
            {
                // 更新能观测到该点的帧数加1(被当前帧观测了)
                pMP->IncreaseVisible();
                // 标记该点被当前帧观测到
                pMP->mnLastFrameSeen = mCurrentFrame.mnId;
                // 标记该点在后面搜索匹配时不被投影,因为已经有匹配了
                pMP->mbTrackInView = false;
            }
        }
    }

    // 准备进行投影匹配的点的数目
    int nToMatch=0;

    // Project points in frame and check its visibility
    // Step 2:判断所有局部地图点中除当前帧地图点外的点,是否在当前帧视野范围内
    for(vector<MapPoint*>::iterator vit=mvpLocalMapPoints.begin(), vend=mvpLocalMapPoints.end(); vit!=vend; vit++)
    {
        MapPoint* pMP = *vit;

        // 已经被当前帧观测到的地图点肯定在视野范围内,跳过
        if(pMP->mnLastFrameSeen == mCurrentFrame.mnId)
            continue;
        // 跳过坏点
        if(pMP->isBad())
            continue;
        
        // Project (this fills MapPoint variables for matching)
        // 判断地图点是否在在当前帧视野内
        if(mCurrentFrame.isInFrustum(pMP,0.5))
        {
        	// 观测到该点的帧数加1
            pMP->IncreaseVisible();
            // 只有在视野范围内的地图点才参与之后的投影匹配
            nToMatch++;
        }
    }

    // Step 3:如果需要进行投影匹配的点的数目大于0,就进行投影匹配,增加更多的匹配关系
    if(nToMatch>0)
    {
        ORBmatcher matcher(0.8);
        int th = 1;
        if(mSensor==System::RGBD)   //RGBD相机输入的时候,搜索的阈值会变得稍微大一些
            th=3;

        // If the camera has been relocalised recently, perform a coarser search
        // 如果不久前进行过重定位,那么进行一个更加宽泛的搜索,阈值需要增大
        if(mCurrentFrame.mnId<mnLastRelocFrameId+2)
            th=5;

        // 投影匹配得到更多的匹配关系
        matcher.SearchByProjection(mCurrentFrame,mvpLocalMapPoints,th);
    }
}

4.函数解析 

        一、遍历当前帧的地图点,对于是坏点的地图点将其删除。若该地图点不是坏点,则

        ①该地图点能被观测到的帧数mnVisible加1 

        ②通过mnLastFrameSeen标记位设置为当前帧从而得到该点被当前帧观测到的标记。

        ③标记该点在后面搜索匹配时不被投影的标记mbTrackInView,因为已经有匹配了。

        二、判断所有局部地图点mvpLocalMapPoints中除当前帧地图点外的点,是否在当前帧视野范围内:

        注意:局部地图点在Tracking::UpdateLocalPoints函数中得到

ORB-SLAM2 --- Tracking::UpdateLocalPoints函数解析https://blog.csdn.net/qq_41694024/article/details/128321282

        ①若已经被当前帧观测到的地图点肯定在视野范围内,跳过。(通过mnLastFrameSeen标记判断是否该地图点被当前帧观测)

        ②跳过坏点

        ③判断地图点是否在在当前帧视野内,若该地图点在当前帧的视野中,将观测到该点的帧数加1。(因为我们是一帧帧传进来的,不存在重复计数)

ORB-SLAM2 --- Frame::isInFrustum函数解析https://blog.csdn.net/qq_41694024/article/details/128334862

        三、如果需要进行投影匹配的点的数目nToMatch大于0,就进行投影匹配,增加更多的匹配关系

        如果不久前进行过重定位,那么进行一个更加宽泛的搜索,阈值需要增大。

        我们利用投影匹配法找到更多的匹配关系。

ORB-SLAM2 --- ORBmatcher::SearchByProjection函数解析icon-default.png?t=M85Bhttps://mp.csdn.net/mp_blog/creation/editor/128365489

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mycat(6):mycat简单配置

1 找到conf/schema.xml并备份 2 配置虚拟表table[在schema里面] 其中 sharding-by-intfile 为rule.xml中的规则 规则文件为conf文件夹中的partition-hash-int.txt 3 配置数据节点dataNode 现在数据库新建3个数据库&#xff0c;skywalking&#xff0c;skywalking1&#xff0c;s…

[附源码]计算机毕业设计Python的低碳生活记录网站(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

MapReduce 排序

文章目录WritableComparable 排序一、排序概述1、排序分类2、自定义排序(1)、原理分析二、WritableComparable 排序案例(全排序)1、需求WritableComparable 排序 一、排序概述 排序是MapReduce框架中最重要的操作之一 MapTask和ReduceTask均会对数据按照key进行排序&#xff…

使用c++部署tensorrt加速yolov7

先放上一张我运行成功的截图,只要跟着我的教程一步一步按操作,下载好匹配的软件是一定可以成功的! 我相信想要在C++平台使用tensorrt加速的朋友们也是有很强的计算机基础的,那么简单的部分我们就跳过,重点是和大家介绍模型转换的部分以及环境的搭建。 一. 环境 我的cudn…

docker-compose安装部署

一、前言 docker compose 给容器做单机编排的。Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 docker compose是docker的独立产品&#xff0c;因此安装docker compose之前需要安装docker&#xff0c;Centos部署Docker_crazyK.的博…

高斯信号的贝叶斯步长最小均方算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

云原生爱好者周刊 | 使用 WASM 来写博客是什么感觉?

开源项目推荐 zzhack zzhack 是一个静态博客框架&#xff0c;是一个纯正的 WASM 应用&#xff0c;它由 Rust & Yew 来作为技术栈进行搭建&#xff0c;UI 设计比较美观&#xff0c;大家也可以直接使用该项目的设计模板零成本构建 WASM 应用。 Tracee Tracee 是一个运行时…

数据结构与算法之双向链表的设计与实现

文章目录前言一、双向链表1.1 概念1.2 双向链表的应用1.3 双向链表的node方法1.4 双向链表的add方法1.5 双向链表的remove方法1.6 整体代码1.7 接口测试二、对比学习2.1 单向链表 vs 双向链表2.2 双向链表 vs 动态数组2.3 ArrayList和LinkedList的区别前言 文章链接之前所介绍…

基于python的C环境安装(NLP文本纠错项目使用)

1.下载c环境&#xff1a;&#xff08;window系统&#xff09; 链接&#xff1a;Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 2.安装 1.打开下载的安装包 2.进入如下页面&#xff0c;按照下图进行勾选&#xff0c;注意&#xff0c;其它不要动…

全渠道营销与多渠道营销:定义、比较、示例

关键词&#xff1a;全渠道营销、多渠道营销 全渠道还是多渠道&#xff1f;您正在踏上跨境电子商务之旅&#xff0c;为您的品牌寻找合适的营销策略&#xff0c;但这一切似乎都过于理论化和复杂。 我们将使事情变得更容易&#xff0c;因为本文全面解释了多渠道营销和全渠道营销之…

【文本检测】1、DBNet | 实时场景文本检测器

文章目录一、背景二、方法2.1 二值化2.2 Adaptive threshold2.3 可变形卷积2.4 生成标签2.5 优化过程三、效果3.1 实验数据3.2 实验细节3.3 消融实验3.4 和其他方法的对比论文&#xff1a;Real-time Scene Text Detection with Differentiable Binarization 代码&#xff1a;h…

不懂应该怎么选合适的医疗器械进销存?

在医院运行过程中&#xff0c;需要管理医疗设备的采购、养护、报废等各个环节。医疗器械进销存软件是集医院设备、物资、耗材的申请、采购、出入库、维修、维护、折旧、固定资产管理、效益分析等全流程管理功能于一体&#xff0c;实现医院医疗设备的信息化&#xff0c;数据库规…

数据结构之【时间复杂度和空间复杂度】

如何去评价一个代码它的效率高不高呢&#xff1f; 我们通常从两个方面去看&#xff01; 时间复杂度&#xff1a;主要衡量一个算法的运行速度空间复杂度&#xff1a;主要衡量一个算法所需要的额外空间 1. 时间复杂度 1.1 时间复杂度的定义 在计算机科学中&#xff0c;算法的…

算法题中常用的位运算

文章目录为什么使用位运算&#xff1f;十进制和二进制之间的转化短除法&#xff08;十进制转二进制&#xff09;幂次和&#xff08;二进制转十进制&#xff09;位运算符异或运算&#xff08;xor&#xff09;指定位置的位运算位运算实战要点为什么使用位运算&#xff1f; 机器采…

代码随想录刷题记录day46 最长公共子序列+不相交的线+最大子数组和

代码随想录刷题记录day46 最长公共子序列不相交的线最大子数组和 1143. 最长公共子序列 思想 1.dp数组的定义 dp[i][j]表示 以i-1为结尾的字符串text1和以j-1为结尾的字符串2的最长公共子序列长度 2.递推公式 如果text1.charAt(i-1)text2.charAt(j-1) dp[i][j]dp[i-1][j-1…

TS 对象可能为“未定义”,不能将类型“ XXXX | undefined “分配给类型{ xxxx }

前言&#xff1a; 最近用 typeScript &#xff0c;也就是大家常说的 【 TS 】写点东西&#xff0c;但是老是提醒这个未定义&#xff0c;那个可能为空&#xff0c;主要是 tsconfig.json 中的严格模式我没关&#xff0c;所以今天总结一下&#xff0c;严格模式中【TS】中遇到 对象…

Learning Disentangled Label Representations for Multi-label Classification

Learning Disentangled Label Representations for Multi-label Classification&#xff0c;2022 学习多标签分类的解纠缠标签表示 要点&#xff1a; 1、主流多标签分类&#xff1a;遵循单标签&#xff08;多类别&#xff09;分类的特征学习机制——学习一个共享的图像特征来…

【Vue实践】尚硅谷张天禹Vue学习笔记(087-135)-20221212~20221218

&#xff08;任意组件通信&#xff09;084-086_全局事件总线 全局事件总线SOP 086_TodoList案例_事件总线 src/mian.js: import Vue from vue import App from ./App.vueVue.config.productionTip falsenew Vue({el:"#app",render: h > h(App),beforeCreate()…

docker高级篇第二章-分布式存储之实战案例:3主3从redis集群搭建

在上一篇文章中&#xff0c;我们介绍了分布式存储的三种方式&#xff1a;hash取余分区、一致性哈希算法分区以及哈希槽分区。本篇&#xff0c;我们就来实战3主3从的哈希槽Redis集群搭建。 大家好,我是凯哥Java(kaigejava)&#xff0c;乐于分享&#xff0c;每日更新技术文章&…

【Redis深度专题】「核心技术提升」分析探究如何实现LFU的热点key发现机制以及内部的Scan扫描技术的原理

前言介绍 业务中存在访问热点是在所难免的&#xff0c;redis也会遇到这个问题&#xff0c;然而如何发现热点key一直困扰着许多用户&#xff0c;redis4.0为我们带来了许多新特性&#xff0c;其中便包括基于LFU的热点key发现机制。 Least Frequently Used Least Frequently Us…