ORB-SLAM2 ---- Tracking::TrackReferenceKeyFrame函数

news2025/7/20 9:22:33

目录

1.函数作用

2.步骤

3.code

4.函数解析

4.1  将当前帧的描述子转化为BoW向量

4.2 总体解释


1.函数作用

        用参考关键帧的地图点来对当前普通帧进行跟踪。

2.步骤

Step 1:将当前普通帧的描述子转化为BoW向量
Step 2:通过词袋BoW加速当前帧与参考帧之间的特征点匹配
Step 3: 将上一帧的位姿态作为当前帧位姿的初始值
Step 4: 通过优化3D-2D的重投影误差来获得位姿
Step 5:剔除优化后的匹配点中的外点
 @return 如果匹配数超10,返回true

3.code

/*

 * @brief 用参考关键帧的地图点来对当前普通帧进行跟踪
 * 
 * Step 1:将当前普通帧的描述子转化为BoW向量
 * Step 2:通过词袋BoW加速当前帧与参考帧之间的特征点匹配
 * Step 3: 将上一帧的位姿态作为当前帧位姿的初始值
 * Step 4: 通过优化3D-2D的重投影误差来获得位姿
 * Step 5:剔除优化后的匹配点中的外点
 * @return 如果匹配数超10,返回true
 * 
 */
bool Tracking::TrackReferenceKeyFrame()
{
    // 特征点都是有一个描述子 ORB词典(描述子集)  特征点的描述子 树根.....汉明距离最小的  ORB词典的树根 nodeid 
	//构造BOw向量  Bowvector pair<nodeid,weight>  FeatureVector<fathernodeID,vector<int>图像的特征点索引 >
    // Step 1:将当前帧的描述子转化为BoW向量  BowVector  FeatureeVector
    mCurrentFrame.ComputeBoW();

    // We perform first an ORB matching with the reference keyframe
    // If enough matches are found we setup a PnP solver
    ORBmatcher matcher(0.7,true);
    vector<MapPoint*> vpMapPointMatches;

    // Step 2:通过词袋BoW加速当前帧与参考帧之间的特征点匹配
    int nmatches = matcher.SearchByBoW(
        mpReferenceKF,          //参考关键帧
        mCurrentFrame,          //当前帧
        vpMapPointMatches);     //存储匹配关系

    // 匹配数目小于15,认为跟踪失败
    if(nmatches<15)
        return false;

    // Step 3:将上一帧的位姿态作为当前帧位姿的初始值
    mCurrentFrame.mvpMapPoints = vpMapPointMatches; //mvpMapPoints存储着是匹配关系:每个特征点对应的MapPoint.如果特征点没有对应的地图点,那么将存储一个空指针
    mCurrentFrame.SetPose(mLastFrame.mTcw); // 用上一次的Tcw设置初值,在PoseOptimization可以收敛快一些

    // Step 4:通过优化3D-2D的重投影误差来获得位姿
    Optimizer::PoseOptimization(&mCurrentFrame);

    // Discard outliers
    // Step 5:剔除优化后的匹配点中的外点
    //之所以在优化之后才剔除外点,是因为在优化的过程中就有了对这些外点的标记
    int nmatchesMap = 0;
    for(int i =0; i<mCurrentFrame.N; i++)
    {
        if(mCurrentFrame.mvpMapPoints[i])
        {
            //如果对应到的某个特征点是外点
            if(mCurrentFrame.mvbOutlier[i])
            {
                //清除它在当前帧中存在过的痕迹
                MapPoint* pMP = mCurrentFrame.mvpMapPoints[i];

                mCurrentFrame.mvpMapPoints[i]=static_cast<MapPoint*>(NULL);
                mCurrentFrame.mvbOutlier[i]=false;
                pMP->mbTrackInView = false;
                pMP->mnLastFrameSeen = mCurrentFrame.mnId;
                nmatches--;
            }
            else if(mCurrentFrame.mvpMapPoints[i]->Observations()>0)
                //匹配的内点计数++
                nmatchesMap++;
        }
    }
    // 跟踪成功的数目超过10才认为跟踪成功,否则跟踪失败
    return nmatchesMap>=10;
}

4.函数解析

4.1  将当前帧的描述子转化为BoW向量

ComputeBoW函数解析icon-default.png?t=M85Bhttps://blog.csdn.net/qq_41694024/article/details/128007040?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128007040%22%2C%22source%22%3A%22qq_41694024%22%7D

4.2 总体解释

        我们先通过词袋BoW加速当前帧与参考帧之间的特征点匹配,如果匹配数目小于15,认为跟踪失败(因为匹配数目太小影响位姿恢复结果),将上一帧的位姿态作为当前帧位姿的初始值,然后通过优化得到这帧的位姿。随后剔除优化后的匹配点中的外点。如果追踪成功的数目大于10则认为跟踪成功!

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

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

相关文章

PG::Covfefe

nmap -Pn -p- -T4 --min-rate1000 192.168.205.10 nmap -Pn -p 22,80,31337 -sCV 192.168.205.10 先查看31337端口的robots.txt目录&#xff0c;几个隐藏文件未发现可利用的地方 dirb对31337路径的枚举中发现了.ssh 访问后发现存在私钥 下载id_rsa和id_rsa.pub 得知用户名为…

Vscode-Git graph怎么看?

VScode可以使用插件查看git提交图谱&#xff0c;这个图谱看起来眼花缭乱&#xff0c;今天花时间看懂了&#xff0c;在这里分享一下。 在Vscode插件中搜索git graph安装 打开git项目&#xff0c;在左下角可以看到git graph 在右侧可以看到按照时间分布的commit&#xff0c;代表…

Java JSP JAVAweb在线考试系统源码网上考试系统源码(ssm考试管理系统)

JSP在线考试系统源码网上考试系统源码&#xff08;ssm考试管理系统&#xff09;

PLC中ST编程的IF判断

如果判断条件是如果...否则...的时候&#xff1b; 如果wData的值是16进制的FFFF&#xff0c;十进制的65535&#xff1b;就执行IF中的语句&#xff0c;否则就执行ELSE中的&#xff1b; 当wData的值为0时&#xff0c;因不符合IF的判断条件&#xff0c;执行了ELSE中的语句&#x…

MySQL索引底层数据结构

索引简介 索引是一个排好序的数据结构&#xff0c;包含着对数据表里所有记录的引用指针&#xff0c;如下图所示。索引文件和数据文件一样都存储在磁盘中&#xff0c;数据库索引的目的是在检索数据库时&#xff0c;减少磁盘读取次数。 常见的索引数据结构包括二叉树、红黑树、…

node多版本控制

今天遇到一个问题&#xff1a; 下载了一个vue项目&#xff0c;一直卡在npm install阶段&#xff0c;折腾了半天&#xff0c;发现是版本太高了&#xff0c;需要降低一下版本&#xff0c;但是其他项目需要高版本的&#xff0c;这不就冲突了&#xff1b; 找到了一个node多版本控制…

基于SSM的亲子活动平台的搭建与实现(源码+数据脚本+论文+技术文档)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

葡萄糖-聚乙二醇-刀豆球蛋白A,ConcanavalinA-PEG-Glucose

葡萄糖-聚乙二醇-刀豆球蛋白A&#xff0c;ConcanavalinA-PEG-Glucose 中文名称&#xff1a;葡萄糖-刀豆球蛋白A 英文名称&#xff1a;Glucose-ConcanavalinA 别称&#xff1a;刀豆球蛋白A修饰葡萄糖&#xff0c;ConA-葡萄糖 存储条件&#xff1a;-20C&#xff0c;避光&…

数据结构复习题

数据结构课程复习纲要 核心知识点 从数据结构的逻辑结构、存储结构和数据的运算三个方面去掌握线性表、栈、队列、串、数据、广义表、数和图等常用的数据结构。掌握在各种常用的数据结构上实现的排序和查找运算。对算法的时间和空间复杂度有一定的分析能力。针对简单的应用问…

Python:每日一题之四平方和

题目描述 四平方和定理&#xff0c;又称为拉格朗日定理&#xff1a; 每个正整数都可以表示为至多 4 个正整数的平方和。 如果把 0 包括进去&#xff0c;就正好可以表示为 4 个数的平方和。 比如&#xff1a; 5 0^2 0^2 1^2 2^2&#xff1b; 7 1^2 1^2 1^2 2^2&am…

CF385D Bear and Floodlight

题意简述&#xff08;翻译&#xff09; 在平面直角坐标系上&#xff0c;沿直线从 (l,0)(l,0)(l,0) 走到 (r,0)(r,0)(r,0) 。有 nnn 盏灯&#xff0c;第 iii 盏灯位于 (xi,yi)(x_i,y_i)(xi​,yi​) &#xff0c;可以照亮的角度为 aia_iai​ &#xff08;注意不是弧度制&#xf…

浅尝辄止:数据库--数仓大数据平台--数据中台

很久没有更新博客了&#xff0c;今天主要是想谈一谈自己工作几年总结的心得。 1.浅尝辄止 数据库&#xff1a;基于mysql&#xff0c;oracle来实现数据库分析&#xff08;存储在数据库&#xff0c;使用数据库语言直接分析&#xff0c;最后成报表形式&#xff09;。 数仓&大…

rust编程-通用编程概念(chapter 3.2 3.3 数据类型和函数)

目录 2. 数据类型 2.2 复合类型 3. 函数 2. 数据类型 Rust中的所有值都是有特定数据类型的&#xff0c;rust是强类型语言&#xff0c;也是静态类型语言&#xff08;编译器类型必须确定&#xff09;。 编译器可以根据值来进行类型推断&#xff0c;但对有歧义的&#xff0c;必…

计算机毕业设计——基于SpringBoot框架的网上购书系统的设计与实现

文章目录前言一、背景及意义选题背景选题目的二、系统设计主要功能运行环境三、系统实现部分页面截图展示部分代码展示四、源码获取前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 二十一世纪是网络化&#xff0c;信息化的时代&#xff0c;为了满足广大…

Linux的子shell

linux运行一个shell脚本&#xff0c;其本身能启动它自己的子进程。 一般来说&#xff0c;脚本里的一个外部命令能生成出一个紫禁城&#xff0c;而Bash内建命令却不这样。 将一组命令放在圆括号里执行&#xff0c;形成一个命令列表连续执行。在圆括号里的命令会在一个子shell里…

【算法面试题汇总】LeetBook列表的算法面试题汇总---排序与检索题目及答案

整理不易留个小心心呗&#x1f970; 如果有更好的或者是我有错的地方还请各位大佬指出哦 有些是copy的还望不要介意 排序与检索最大数摆动排序Ⅱ寻找峰值寻找重复数最大数 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组…

【实验记录1】行人重识别

使用ResNet50训练Market15010x00参考0x01准备数据集0x02搭建模型ResNet500x03test0x04可视化结果0x00参考 ⭐️郑哲东博士的GitHub 从零开始行人重识别-知乎 全篇对于上手person ReId 具有重要意义 环境&#xff1a; torch_version1.13.0cu117 python_version3.8.13 torch_ver…

CentOS7下Redis7安装

​欢迎光临我的博客查看最新文章: https://river106.cn 目前Redis的最新稳定版本已到7.0&#xff0c;本文介绍redis-7.0.5在CentOS7.6下的安装使用。 1、下载 Redis下载地址&#xff1a;https://redis.io/download/&#xff0c;或者使用命令直接下载&#xff1a; cd /opt/so…

序列化、反序列化

一、序列化、反序列化概念 序列化(Serialization)是一种将对象以一连串的字节描述的过程,将程序中的对象,放入硬盘(文件)中保存就是序列化,如果不存放在磁盘中,而是一直存放在内存中,会增大内存的消耗;序列化就是将对象的状态信息转换为可以存储或传输的形式的过程;…

Scrapy基本概念——Item Pipeline

一、Item Pipeline介绍 蜘蛛抓取的每一个Item都会被发送到Item Pipeline。根据ITEM_PIPELINES的优先级设置&#xff0c;不同的Item Pipeline依次处理每一个Item&#xff0c;最后可删除该Item不做处理&#xff0c;也可将该Item发送到下一个Item Pipeline。Item Pipeline的主要用…