04 帧 Frame

文章目录

    • 04 帧 Frame
      • 4.1 相机相关信息
      • 4.2 特征点提取
      • 4.2.1 特征点提取 ExtractORB()
      • 4.3 ORB-SLAM2对双目/RGBD特征点的预处理
        • 4.3.1 双目视差公式
        • 4.3.2 双目图像特征点匹配 ComputeStereoMatches()
        • 4.3.3 根据深度信息构造虚拟右目图像:`ComputeStereoFromRGBD()`
      • 4.4 畸变矫正:`UndistortKeyPoints()`
      • 4.5 特征点分配:`AssignFeaturesToGrid()`
      • 4.5 构造函数 `Frame()`
      • 4.6 `Frame` 类的用途

04 帧 Frame

4.1 相机相关信息

Frame 类与相机相关的参数大部分都设为 static 类型,系统内所有的 Frame 对象共享一份相机参数。

成员函数/变量访问控制意义
static bool mbInitialComputationspublic static是否需要为 Frame 类的相机参数赋值
初始化为 true,第一次为相机参数赋值后变为 false
static float fx fy
static float cx cy
static float invfx invfy
public static相机内参
cv::Mat mKpublic相机内参矩阵
float mbpublic双目相机基线
float mbfpublic相机基线与焦距的乘积

这些参数首先由 Tracking 对象从 yaml 配置文件内读入,再传给 Frame 类的构造函数,第一次调用 Frame 的构造函数时为这些成员变量赋值.

4.2 特征点提取

Frame 类构造函数中调用成员变量 mpORBextractorLeftmpORBextractorRight 进行特征点提取。

成员函数/变量访问控制意义
ORBextractor* mpORBextractorLeft
ORBextractor* mpORBextractorRight
public左右目特征点提取器
cv::Mat mDescriptors
cv::Mat mDescriptorsRight
public左右目图像特征点描述子
std::vector<cv::KeyPoint> mvKeys
std::vector<cv::KeyPoint> mvKeysRight
public畸变矫正前的左右目特征点
std::vector<cv::KeyPoint> mvKeysUnpublic矫正后的左目特征点(对应mvKeys
std::vector<float> mvuRightpublic左目特征点在右目中匹配特征点的横坐标(左右目匹配特征点的纵坐标相同)
std::vector<float> mvDepthpublic特征点深度
float mThDepthpublic判断单目特征点和双目特征点的阈值
深度低于该值得特征点被认为是双目特征点
深度低于该值得特征点被认为是单目特征点

mvKeysmvKeysUnmvuRightmvDepth 的坐标索引是对应的,也就是说对于第 i 个图像特征点:

  • 其矫正前的左目特征点是 mvKeys[i]

  • 矫正后的左目特征点是 mvKeysUn[i]

  • 其在右目中对应的特征点的横坐标为 mvuRight[i],纵坐标与 mKeys[i] 相同;

  • 特征点深度为 mvDepth[i]

对于单目特征点(单目相机输入的特征点或没有找到右目匹配的左目图像特征点),其 mvuRightmvDepth 均为 -1。

4.2.1 特征点提取 ExtractORB()

成员函数/变量访问控制意义
void ExtractORB(int flag, const cv::Mat &im)public直接调用 orbExtractor 提取特征点
void Frame::ExtractORB(int flag, const cv::Mat &im)
{if(flag==0)(*mpORBextractorLeft)(im,cv::Mat(),mvKeys,mDescriptors);else(*mpORBextractorRight)(im,cv::Mat(),mvKeysRight,mDescriptorsRight);
}

4.3 ORB-SLAM2对双目/RGBD特征点的预处理

双目/RGBD 相机可以得到特征点的立体信息,包括右目特征点信息(mvuRight)、特征点深度信息(mvDepth):

  • 对于双目相机,通过双目特征点匹配关系计算特征点的深度值;
  • 对于 RGBD 相机,根据特征点深度构造虚拟的右目图像特征点。
    在这里插入图片描述
成员函数/变量访问控制意义
void ComputeStereoMatches()public双目图像特征点匹配,用于双目相机输入图像预处理
void ComputeStereoFromRGBD(const cv::Mat &imDepth)public根据深度信息构造虚拟右目图像,用于RGBD相机输入图像预处理
cv::Mat UnprojectStereo(const int &i)public根据深度信息将第 i 个特征点反投影成 MapPoint

通过这种预处理,在后面 SLAM 系统的其他部分中不用再区分双目特征点和 RGBD 特征点,它们都会以双目特征点的形式被处理(仅通过判断 mvuRight[idx] 判断某特征点是否有深度)。

4.3.1 双目视差公式

在这里插入图片描述

根据三角形相似关系

z − f z = b − u L + u R b \frac{z-f}{z}=\frac{b-u_L+u_R}{b} zzf=bbuL+uR

整理,得

z = f b d , d = u L − u R z=\frac{f b}{d}, \quad d=u_L-u_R z=dfb,d=uLuR

其中, z z z 为观测距离(深度), b b b 为基线, f f f 为焦距, d d d 为视差。

4.3.2 双目图像特征点匹配 ComputeStereoMatches()

在这里插入图片描述

双目相机分别提取到左右目特征点后对特征点进行双目匹配,并通过双目视差估计特征点深度。双目特征点匹配步骤:

(1)粗匹配:根据特征点描述子距离和金字塔层级判断匹配.粗匹配关系是按行寻找的,对于左目图像中每个特征点,在右目图像对应行上寻找匹配特征点。

(2)精匹配: 根据特征点周围窗口内容相似度判断匹配。

(3)亚像素插值: 将特征点相似度与匹配坐标之间拟合成二次曲线,寻找最佳匹配位置(得到的是一个小数)。

(4)记录右目匹配 mvuRight 和深度 mvDepth 信息。

(5)离群点筛选: 以平均相似度的 2.1 倍为标准,筛选离群点。

在这里插入图片描述

4.3.3 根据深度信息构造虚拟右目图像:ComputeStereoFromRGBD()

在这里插入图片描述

对于 RGBD 特征点,根据深度信息构造虚拟右目图像(视差公式)。这样在就可以将 RGBD 图像和双目图像归为一类,便于程序处理。

4.4 畸变矫正:UndistortKeyPoints()

成员函数/变量访问控制意义
cv::Mat mDistCoefpublic相机的畸变矫正参数
std::vector<cv::KeyPoint> mvKeys
std::vector<cv::KeyPoint> mvKeysRight
public原始左/右目图像提取出的特征点(未校正)
std::vector<cv::KeyPoint> mvKeysUnpublic畸变矫正后的左目特征点
void UndistortKeyPoints()public矫正特征点(仅对单目和RGBD)
static float mnMinX,mnMaxX
static float mnMinY,mnMaxY
public畸变矫正后的图像边界
void ComputeImageBounds(const cv::Mat &imLeft)private计算畸变矫正后的图像边界

畸变矫正只对单目和 RGBD 相机输入图像有效,双目相机的畸变矫正参数均为 0,因为双目相机数据集在发布之前已经预先做了 双目矫正

4.5 特征点分配:AssignFeaturesToGrid()

在对特征点进行预处理后,将特征点分配到 48 行 64 列的网格中以加速匹配。

成员函数/变量访问控制意义
FRAME_GRID_ROWS=48
FRAME_GRID_COLS=64
#DEFINE网格行数/列数
static float mfGridElementWidthInv
mfGridElementHeightInv
public static每个网格的宽度/高度
std::vector<std::size_t> mGrid[FRAME_GRID_COLS][FRAME_GRID_ROWS]public每个网格内特征点编号列表
void AssignFeaturesToGrid()private将特征点分配到网格中
vector<size_t> GetFeaturesInArea(const float &x, const float &y, const float &r, const int minLevel=-1, const int maxLevel=-1) constpublic获取半径为r的圆域内的特征点编号列表

为什么要分配特征点呢?

我们将图片分割为 64*48 大小的栅格,并将关键点按照位置分配到相应栅格中。匹配时,按照先粗后精的思想,先搜索栅格,再在栅格内搜索对应的像素点,这样比逐一比较像素点,效率更高。

4.5 构造函数 Frame()

包括默认构造函数、拷贝构造函数、单目/双目/RGBD 模式构造函数。

4.6 Frame 类的用途

成员变量/函数访问控制意义
Frame mCurrentFramepublic当前正在处理的帧
Frame mLastFrameprivate上一帧

Tracking 线程每收到一帧图像,就调用函数 Tracking::GrabImageMonocular()Tracking::GrabImageStereo()Tracking::GrabImageRGBD() 创建一个 Frame 对象,赋值给 mCurrentFrame

Track() 函数跟踪结束后,将 mCurrentFrame 赋值给 mLastFrame
在这里插入图片描述

除了少数被选为 KeyFrame 的帧以外,大部分 Frame 对象的作用仅在于 Tracking 线程内追踪当前帧位姿,不会对 LocalMapping 线程和 LoopClosing 线程产生任何影响,在 mLastFramemCurrentFrame 更新之后就被系统销毁了。

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

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

相关文章

静态网页设计——环保网(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1BC4y1v7ZY/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

【教学类-45-02】X-Y之间的三连减题(a-b-c=)

作品展示&#xff1a; 背景需求&#xff1a; 【教学类-45-01】X-Y之间的三连加题(abc)-CSDN博客文章浏览阅读5次。【教学类-45-01】X-Y之间的三连加题(abc)https://blog.csdn.net/reasonsummer/article/details/135436915 有了三连加怎么能没有三连减&#xff0c;修改参数&am…

移动通信原理与关键技术学习(第四代蜂窝移动通信系统)

前言&#xff1a;LTE 标准于2008 年底完成了第一个版本3GPP Release 8的制定工作。另一方面&#xff0c;ITU 于2007 年召开了世界无线电会议WRC07&#xff0c;开始了B3G 频谱的分配&#xff0c;并于2008 年完成了IMT-2000&#xff08;即3G&#xff09;系统的演进——IMT-Advanc…

python协程asyncio的应用,async,await,loop

关于协程&#xff0c;asyncio&#xff0c;async&#xff0c;await&#xff0c;loop的概念&#xff0c;参照上一篇文章可迭代对象&#xff0c;迭代器&#xff0c;生成器&#xff0c;协程-CSDN博客 上一章我们详细的讲解了上述各个名词的概念&#xff0c;但是这些东西实际上该怎…

mybatisPlus CodeGenerator 代码生成

在 test 目录下新建 CodeGenerator 类&#xff0c;用于 mybatis-plus 自动生成 java 代码 package com.edward;import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplu…

【linux】Ubuntu 22.04.3 LTS截屏

一、快捷键 交互式录屏 ShiftCtrltAltR 交互式截图 Print 对窗口进行截图 AltPrint 截图 ShiftPrint 快捷键可能取决于使用的桌面环境和个人的键盘快捷键设置。如果上述快捷键不起作用&#xff0c;可能需要检查系统设置中的键盘快捷键部分&#xff0c;以了解系统中截图的…

Hive精选10道面试题

1.Hive内部表和外部表的区别&#xff1f; 内部表的数据由Hive管理&#xff0c;外部表的数据不由Hive管理。 在Hive中删除内部表后&#xff0c;不仅会删除元数据还会删除存储数据&#xff0c; 在Hive中删除外部表后&#xff0c;只会删除元数据但不会删除存储数据。 内部表一旦…

【大数据】Zookeeper 数据写入与分布式锁

Zookeeper 数据写入与分布式锁 1.数据是怎么写入的2.基于 Zookeeper 实现分布式锁 1.数据是怎么写入的 无论是 Zookeeper 自带的客户端 zkCli.sh&#xff0c;还是使用 Python&#xff08;或者其它语言&#xff09;实现的客户端&#xff0c;本质上都是连接至集群&#xff0c;然…

Redis 键中冒号的用途是什么?可以使匹配查询更快吗?

Redis 键中冒号的用途是什么在Redis中&#xff0c;冒号&#xff08;:&#xff09;用作键的分隔符&#xff0c;它的主要作用是创建层次结构和命名空间。通过在键中使用冒号&#xff0c;可以将键分为多个部分&#xff0c;从而更好地组织和管理数据。 以下是冒号在Redis键中的用途…

IMS基本架构

IP Multimedia Core Network Subsystem (IMS)商用已久&#xff0c;相对于CS domain的语音方案&#xff0c;IMS则是基于IETF定义的会话控制功能与多媒体传输功能通过IP-CAN实现的 全IP完整语音解决方案。 IMS能为无线和有线用户实现语音、视频、消息、数据等服务。便于运营商通过…

redis复习笔记03(小滴课堂)

Redis6常见数据结构概览 0代表存在&#xff0c;1代表不存在。 1表示删除成功&#xff0c;0表示失败。 查看类型&#xff0c;默认string类型。 也可以设置set类型。 list类型。 查看key的过期时间&#xff1a; Redis6数据结构之String类型介绍和应用场景 批量设置&#xff1a; …

AI与5G、IDC等成为数字经济的重要基础设施

AI与5G、IDC等已经成为数字经济的重要基础设施&#xff0c;它们的影响和作用不容忽视。随着技术的迅速发展&#xff0c;AI在各行各业都得到了广泛应用&#xff0c;并成为数字经济的核心驱动力之一。 首先&#xff0c;AI的兴起为数字经济带来了巨大的机遇。AI技术可以帮助企业从…

LiveSIPB流媒体国网B接口功能-国网B接口服务安装使用说明

LiveSIPB 国网B接口服务安装使用说明 1、服务说明1.1、安装包说明1.2、国网B接口信令服务1.3、国网B接口流媒体服务1.4、配置信令服务(LiveCMS)1.5、配置流媒体服务(LiveSMS) 2、服务运行2.1、Windows2.2、Linux 3、配置设备接入3.1、海康STATE_GRID接入示例 4、平台使用4.1、管…

【HarmonyOS】装饰器下的状态管理与页面路由跳转实现

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

小白入门基础 - Restful

一&#xff1a;REST与RESTful&#xff1a; REST&#xff1a;表现层状态转移&#xff0c;资源在网络中以某种形式进行状态转移。 RESTful是基于REST理念的一套开发风格&#xff0c;是具体的开发规则。 服务器端只返回数据&#xff0c;以json或者xml的格式。 RESTful开发规范&a…

八大算法排序@归并排序(C语言版本)

目录 归并排序概念算法思想第一步第二步第三步 算法步骤代码实现代码1代码优化 时间复杂度空间复杂度特性总结 归并排序 概念 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治策略的经典排序算法。它的基本思想是将待排序的数组划分成两个子数组&#xff0c;分别对…

大模型实战笔记02——大模型demo

大模型实战笔记02——大模型demo 1、大模型及InternLM模型介绍 2、InternLM-Chat-7B智能对话Demo 3、Lagent智能体工具调用Demo 4、浦语灵笔图文创作理解Demo 5、通用环境配置 注 笔记图片均为视频截图 笔记课程视频地址&#xff1a;https://www.bilibili.com/video/BV1Ci4y1…

基于 IP 多播的网络会议程序(2024)

1.题目描述 局域网 IP 多播程序&#xff0c;设计一个图形界面的网络会议程序&#xff08;实现文本多播方式即可&#xff09;。 2.演示Demo 3.参考代码 广播发送代码 //服务端 #include <winsock2.h> #include <iostream> #include <list>#pragma comment(l…

顶顶通呼叫中心中间件通过队列外呼拨打另一个sip并且放音(mod_cti基于FreeSWITCH)

介绍 顶顶通呼叫中心中间件通过队列外呼拨打另一个sip并且放音 一、添加acl 打开ccadmin->点击配置文件->点击acl.conf->在</list>后面添加一条图中的信息->muqi是我自己设置的名字你们可以修改为自己需要的名字->添加好了点击提交XML->在运维调试点…

Redis概览

Redis存储是Key-Value结构的数据&#xff0c;其中Key是字符串类型&#xff0c;Value有5种常见的数据类型 字符串 String 哈希 hash 列表 list 集合 set 有序集合 sorted set / zset 各种数据类型的特性 字符串操作命令 : ● SET ke…