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.hqwc.cn/news/325820.html

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

相关文章

【Python机器学习】线性模型——线性回归

线性回归&#xff0c;又叫普通最小二乘法&#xff0c;是回归问题最简单也是最经典的线性方法。线性回归寻找参数w和b&#xff0c;使得对训练集的预测值与真实的回归目标值y之间的均方误差最小。 均方误差是预测值与真实值之差的平方和除以样本差。线性回归没有参数&#xff0c…

计算机毕业设计-----SSM餐厅点餐收银管理系统

项目介绍 用于餐厅的收银管理系统&#xff0c;包含了四个模块 1.桌位模块 桌位模块主要是用于管理桌位的模块&#xff0c;包括点菜到结账的流程 将桌位人数设置为0可以滞空当前桌位 2.账单模块 账单模块记录了每一天的帐单汇总&#xff0c;同时提供了年月日账单的统计&#x…

stable diffusion 基础教程-文生图

置顶大模型插件资源链接 你如果没有魔法上网,请自取 百度云盘链接:链接:https://pan.baidu.com/s/1_xAu47XMdDNlA86ufXqAuQ?pwd=23wi 提取码:23wi 有疑问加微:mincarver 界面介绍 参数解释 参数解释Sampling method扩散去噪算法的采样模式,不同采样模式会带来不一样的效…

极智一周 | 谈谈AI发展、训练算力、推理算力、AI编译框架、Copilot键 And so on

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多技术分享 大家好&#xff0c;我是极智视界&#xff0c;带来本周的 [极智一周]&#xff0c;关键词&#xff1a;谈谈AI发展、训练算力、推理算力、AI编译框架、Copilot键 And so on。 邀您加入我的知识星球「极智视界」&a…

栈的数据结构实验报告

一、实验目的&#xff1a; 1、理解栈的定义&#xff1b; 2、利用栈处理实际问题。 二、实验内容&#xff08;实验题目与说明&#xff09; 利用栈实现数据的分类&#xff0c;将输入的整数以奇偶为标准分别存放到两个栈中&#xff0c;并最终从栈1和栈2输出偶数和奇数序列。 …

nodejs安装、nodejs环境变量配置、npm安装、vue安装

官网下载链接:https://nodejs.org/en/download/ 个人下载版本&#xff1a;node-v20.10.0-x64.msi&#xff0c;下载完成后&#xff0c;点击安装&#xff0c;除了更换安装目录&#xff0c;其他直接下一步即可 安装完成后执行&#xff1a;npm -v 下面开始配置环境变量&#xf…

Visual Studio 2017 + opencv4.6 + contribute + Cmake(Aruco配置版本)指南

之前配置过一次这个&#xff0c;想起这玩意就难受&#xff0c;贼难配置。由于要用到里面的一个库&#xff0c;不得已再进行配置。看网上的博客是真的难受&#xff0c;这写一块&#xff0c;那里写一块&#xff0c;乱七八糟&#xff0c;配置一顿发现写的都是错的&#xff0c;还得…

cissp 第10章 : 物理安全要求

10.1 站点与设施设计的安全原则 物理控制是安全防护的第一条防线&#xff0c;而人员是最后一道防线。 10.1.1 安全设施计划 安全设施计划通过关键路径分析完成。 关键路径分析用于找出关键应用、流程、运营以及所有必要支撑元索间的关系。 技术融合指的是各种技术、解决方案…

基于ssm的智慧社区电子商务系统+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

C#中的值和引用笔记

文章目录 1. 简单介绍2. 如何判断值类型和引用类型3. 语句块4. 变量的生命周期5. 结构体中的值和引用6. 数组中的存储规则7. 结构体继承接口 1. 简单介绍 2. 如何判断值类型和引用类型 在代码中直接转到内部F12 如string类型 值类型int 3. 语句块 4. 变量的生命周期 5. 结构…

2022年多元统计分析期中试卷

多元正态均值检验 一、去年卖出的一岁牛犊的平均身高为 51 英寸&#xff0c;平均背脂厚度是 0.3 英寸&#xff0c;平均肩高是 56 英寸。已知今年卖出的 76 头一岁牛犊的 3 项平均指标为(50, 0.2, 54)‘&#xff0c;样本协差阵及其逆矩阵为 S [ 3.00 − 0.053 2.97 − 0.053 0…

Linux内核--进程管理(六)内核进程管理几种CPU调度策略

目录 一、引言 二、CPU调度的直观想法 ------>2.1、FIFO ------>2.2、Priority ------>2.3、调度矛盾 三、各种CPU调度算法 ------>3.1、FCFS(First Come,First Served) ------>3.2、SJF(Short Job First,短作业优先) ------>3.3、RR算法(按时间片…