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

news2024/12/27 14:53:56

目录

1.函数作用

2.到这步之前我们做了什么 

3.code 

4.函数解析 


1.函数作用

        哈哈哈,这其实应该是这个专栏的第一篇文章,也没什么必要写,但是我怕大家看的时候对单目还没有初始化没有进入跟踪线程前面比较懵逼,所以我补了此内容。

        这篇博客主要写的就是追踪线程前的工作。

        这个函数的主要作用是输入左目RGB或RGBA图像,输出世界坐标系到该帧相机坐标系的变换矩阵。

2.到这步之前我们做了什么 

        我们思考以下从输入命令行到这个函数系统都做了什么?

        我们在ORB-SLAM2根目录下输入命令后:

./Examples/Monucular/mono_tum ./Vocabulary/ORBvoc.txt ./Examples/Monucular/TUMX.yaml data/rgbd_dataset_freiburg1_xyz

        系统读取我们输入的参数到单目的main函数:mono_tum.cc

        将数据集中的图片索引转化成图片+时间戳的形式存放在vstrImageFilenames容器和vTimestamps容器中,这个过程请参阅我的一篇博客:

ORB-SLAM2 ---- LoadImages函数解析icon-default.png?t=M85Bhttps://blog.csdn.net/qq_41694024/article/details/126285573        随后,SLAM系统将每帧图片im(vstrImageFilenames容器中的一帧图像)和它对应的时间戳tframe(vTimestamps容器的一个float型变量)传入单目SLAM的函数的单目追踪器接口System::TrackMonocular中。

SLAM.TrackMonocular(im,tframe);

        由于SLAM系统最终输出的是相机的位姿,因此System::TrackMonocular函数是追踪函数的祖先,它要向SLAM主函数返回当前帧im的位姿,它的返回值为cv::Mat型即相机相对于第一帧的3D坐标。

        而这个函数得到位姿的前提又是调用我们这节所讲的函数Tracking::GrabImageMonocular通过调用追踪线程Tracking::track而得到单帧的位姿。

3.code 

cv::Mat Tracking::GrabImageMonocular(const cv::Mat &im,const double &timestamp)
{
    mImGray = im;

    // Step 1 :将彩色图像转为灰度图像
    //若图片是3、4通道的,还需要转化成灰度图
    if(mImGray.channels()==3)
    {
        if(mbRGB)
            cvtColor(mImGray,mImGray,CV_RGB2GRAY);
        else
            cvtColor(mImGray,mImGray,CV_BGR2GRAY);
    }
    else if(mImGray.channels()==4)
    {
        if(mbRGB)
            cvtColor(mImGray,mImGray,CV_RGBA2GRAY);
        else
            cvtColor(mImGray,mImGray,CV_BGRA2GRAY);
    }

    // Step 2 :构造Frame
    //判断该帧是不是初始化
    if(mState==NOT_INITIALIZED || mState==NO_IMAGES_YET) //没有成功初始化的前一个状态就是NO_IMAGES_YET
        mCurrentFrame = Frame(
            mImGray,
            timestamp,
            mpIniORBextractor,      //初始化ORB特征点提取器会提取2倍的指定特征点数目
            mpORBVocabulary,
            mK,
            mDistCoef,
            mbf,
            mThDepth);
    else
        mCurrentFrame = Frame(
            mImGray,
            timestamp,
            mpORBextractorLeft,     //正常运行的时的ORB特征点提取器,提取指定数目特征点
            mpORBVocabulary,
            mK,
            mDistCoef,
            mbf,
            mThDepth);

    // Step 3 :跟踪
    Track();

    //返回当前帧的位姿
    return mCurrentFrame.mTcw.clone();
}

4.函数解析 

        这个函数是为了将我们的图片传入追踪线程的帧做准备的。

        mImGray是一个cv::Mat型的变量,我们将SLAM主函数向下传的帧im复制到mImGray变量中,将彩色图像转为灰度图像。

        然后构造当前帧,构造之前判断下SLAM系统是否初始化完成:

       它们的主要区别在于提取特征点的数目不同,若用mpIniORBextractor类型的ORBMatcher则会提取到更多的特征点,我们初始化时希望提取更多的特征点保证SLAM系统的稳定性。

Frame::Frame(const cv::Mat &imGray, const double &timeStamp, ORBextractor* extractor,ORBVocabulary* voc, cv::Mat &K, cv::Mat &distCoef, const float &bf, const float &thDepth)
    :mpORBvocabulary(voc),mpORBextractorLeft(extractor),mpORBextractorRight(static_cast<ORBextractor*>(NULL)),
     mTimeStamp(timeStamp), mK(K.clone()), mDistCoef(distCoef.clone()), mbf(bf), mThDepth(thDepth)

        构造的参数分别是如下含义:

 * @param[in] imGray                            //灰度图
 * @param[in] timeStamp                         //时间戳
 * @param[in & out] extractor                   //ORB特征点提取器的句柄
 * @param[in] voc                               //ORB字典的句柄
 * @param[in] K                                 //相机的内参数矩阵
 * @param[in] distCoef                          //相机的去畸变参数
 * @param[in] bf                                //baseline*f
 * @param[in] thDepth                           //区分远近点的深度阈值

        初始化完成当前帧后,我们将此帧送入追踪现场Tracking::track计算出当前帧的位姿后返回给我们的函数相机的位姿,此函数向上返回输出位姿给TrackMonocular函数作为SLAM系统的输出。

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

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

相关文章

Kali Linux安装go语言环境详解

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是Kali Linux安装go语言环境。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未…

【实操篇】Linux权限管理

目录 ●权限的基本介绍 ●rwx权限 ①rwx作用到文件 ②rwx作用到目录 ●修改权限——chmod ①、-、变更权限 ②数字变更权限 ●修改文件所有者——chown ●修改文件所在组——chgrp ●权限的基本介绍 从中随便找一行进行分析如下图所示&#xff1a; 1.文件类型 - &#x…

Hudi 0.12.0 搭建——集成 Hive3.1 与 Spark3.2

Hudi 搭建环境准备一、安装 Maven1.解压2.配置环境变量3.修改 Maven 下载源二、安装 Hudi1.解压2.配置环境变量3.修改 Hudi 下载源与对应版本号4.修改源码以兼容 Hadoop3.x5. 解决 Spark 依赖冲突6. 解决 Spark 向 Hudi 插入报错7. 编译 Hudi8. 启动测试集群其它生态安装与配置…

JSP ssh驾校管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh驾校管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Mye…

6秒钟读懂网络攻击和防御的有关产品理论

文章目录一 常见网络攻击1.病毒攻击2.DDos网络攻击3.木马攻击WebsSheLL4.渗透攻击数据拖取5.APP漏洞6.营销撸羊毛7&#xff0c;DDoS攻击挑战二&#xff0c;大禹基本功能1.基础防护2.BGP高防包3.BGP高仿IP4.棋牌盾三&#xff0c;大禹技术原理1.高仿IP牵引攻击流量&#xff0c;保…

Java安全--CC3

CC3和CC1和CC6的执行命令方式不一样。CC3使用的是动态类加载。我们把恶意代码写在加载类的静态构造方法中。需要注意的是&#xff1a; 当初始化的时候就会执行静态构造方法&#xff0c;defineClass的时候是不会执行静态构造代码块的&#xff0c;我们在找利用点的时候需要有new…

1658 页的《Java 面试突击核心讲》在牛客网火了,完整版 PDF 开放下载!

前言 我们都知道&#xff0c;在程序员的职业生涯中&#xff0c;有多个发展方向&#xff0c;不过就数据表明&#xff0c;近年来选择架构师方向的开发人员也越来越多。 对于架构师的发展前途&#xff0c;我相信是已经没有争议的&#xff0c;但这个“概念”对于很多开发人员来说…

[ vulhub漏洞复现篇 ] solr XML外部实体注入(CVE-2017-12629-xxe)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

网站权重怎么批量查?怎么批量查询网站的360权重

批量查询网站360权重的操作&#xff1a; 第一步、打开SEO综合查询工具 第二步、添加需要查询的网站域名&#xff08;有多少放多少&#xff0c;一行一个域名&#xff09; 第三步、勾选360权重PC权重和360移动权重 第四步、点击开始查询 第五步、等待查询结果出来 如果需要导出查…

vue 前端实现随机背景色

目录前言&#xff1a;步骤&#xff1a;功能效果展示&#xff1a;代码&#xff1a;总结&#xff1a;前言&#xff1a; 要求是页面对应的几个模块每次打开都要显示多个不同的随机颜色&#xff0c;点击刷新则显示的颜色改变。我就封装成了一个函数&#xff0c;有不足的地方&#…

【小甲鱼C语言】课后笔记第一章第二节——变量

目录 1、变量的命名规则 2、关键字 3、基本数据类型 4、声明变量的语法 5、课后习题&#xff08;编程题&#xff09; 1、变量的命名规则 C语言变量名只能是英文字母&#xff08;A-Z&#xff0c;a-z&#xff09;和数字&#xff08;0-9&#xff09;或者下划线&#xff08;_&…

【云原生进阶之容器】第一章Docker核心技术1.1节——Docker综述

1 Docker简述 1.1 什么是Docker Docker是一个开源的软件项目,让用户程序部署在一个相对隔离的环境运行,借此在Linux操作系统上提供一层额外的抽象,以及操作系统层虚拟化的自动管理机制。需要额外指出的是,Docker并不等于容器(containers),Docker只是容器的一种,其他的种…

使用vite插件编写tsx文件

一般情况下&#xff0c;我们在template标签里去写静态页面模板。现在可以扩展另一种书写风格 tsx&#xff0c;类似react的jsx语法。vue2 的时候就已经支持jsx写法&#xff0c;只不过不是很友好&#xff0c;随着vue3对typescript的支持度增高&#xff0c;tsx写法越来越被接受。 …

基本素质提升(一)----日常/命令积累

目录 一、引言 二、日常积累 三、命令积累 一、引言 这个主题主要带大家学习一下日常开发所使用的命令及相关知识&#xff0c;会持续更新 二、日常积累 1、kill 给某个进程发送信号 kill -STOP pid(进程号)&#xff0c;可以发送任何信号给进程&#xff1b;kill -STOP %…

【云计算与大数据技术】云计算概论介绍

一、什么是云计算 云计算&#xff08;cloud computing&#xff09;是基于互联网的相关服务的增加、使用和交付模式&#xff0c;通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法&#xff0c;过去往往用来用云表示电信网&#xff0c;后…

基于51单片机电动自行车车速报警系统proteus仿真原理图程序

功能&#xff1a; 0.本项目采用STC89C52作为单片机系统的控制MCU 1.LCD1602液晶分三种显示模式 a)显示实时速度和本次里程 b)显示当前时间 c)显示报警速度和总里程 2.超过报警速度将声光报警 3.功能按键介绍 a显示状态下: 上’键——电机速度1 下’键——电机速度-1 设置’键—…

Java基于JSP+mysql的学科竞赛管理系统

随着我学科竞赛是对课堂上所学的理论知识的实践运用&#xff0c;是考察大学生学科基本理论知识和解决实际问题能力的比赛&#xff0c;是高等学校人才培养质量的标志之一&#xff0c;是培养知识-能力-素质协调发展的创新型、高素质人才重要途径&#xff0c;对高校的学风、就业也…

Go开发中配置一个Logger日志的功能实现

为什么需要Logger 一般在开发项目的时候我们都是需要一个存储日志的文件&#xff0c;因为在部署项目以后&#xff0c;我们只能通过去筛查日志进行检索问题&#xff0c;这时候日志是否可以呈现清晰这个对于我们进行排查工作是十分重要的&#xff0c;所以Logger能否展示出我们最…

Linux基础——git和gdb的使用

前言 我们在平时维护和上传代码时会用到git&#xff0c;但是这个git具体是什么&#xff0c;往往又说不清楚。其实git其实就是一个版本管理工具&#xff0c;有了这个工具就能方便快捷地查询自己上传代码的不同版本&#xff0c;对每一次上传的改动了如指掌。 那gdb又是什么呢&a…

文本生成自回归解码策略总结

当今文本生成的主流方式还是自回归式的语言建模&#xff0c;本篇文章对文本生成常用的几种自回归采样&解码策略进行总结&#xff08;以下统称为采样&#xff09;。 采样方式Argmax Decoding&#xff08;贪婪采样&#xff09;Greedy Search&#xff08;贪心搜索&#xff09;…