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.mfbz.cn/a/296456.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python中的h5py包使用

h5py是一个非常强大的工具&#xff0c;可以用于存储和处理大量科学数据。它可以帮助我们提高数据处理的效率和可靠性。 目录 一、h5py1.1 特点1.2 主要功能1.3 常用场景 二、安装h5py三、示例代码3.1 运行结果 四、总结 一、h5py h5py是Python中的一个库&#xff0c;提供了对H…

JS函数实现数字转中文大写

JS函数实现数字转中文大写 1. 数字转字符,分割,去除空字符2. 遍历分割字符,替换为中文3. 增加四位数单位4. 处理零5. 拼接四位数据和单位 项目中,JS将万亿以下正整数转为中文大写 1. 数字转字符,分割,去除空字符 function toChineseNumber(num){const strs num.toString().re…

计算机组成原理 总线

总线 总线定义 总线 总线是一组能为多个部件分时共享的公共信息传送线路 总线的好处 早期计算机外部设备少时大多采用分散连接方式&#xff0c;不易实现随时增减外部设备 为了更好地解决I/O设备和主机之间连接的灵活性问题&#xff0c;计算机的结构从分散连接发展为总线连接 …

Mac环境下Parallels Desktop 19的安装和使用

为了后续构建漏洞靶场和渗透测试环境&#xff0c;我们需要提前准备好几套与宿主机隔离的工作环境&#xff08;Windows、Linux等&#xff09;&#xff0c;在Mac上最常用的就是Paralles Desktop&#xff08;PD&#xff09;工具了&#xff0c;当前最新版本为19。接下来介绍如何安装…

QT工具栏开始,退出

QT工具栏开始&#xff0c;退出 //初始化场景QMenuBar *bar menuBar();setMenuBar(bar);QMenu *startbar bar->addMenu("开始");QAction * quitAction startbar->addAction("退出");connect(quitAction , &QAction::triggered,[](){this->c…

Chromedriver 下载和安装指南

1. 确定Chrome浏览器版本 首先&#xff0c;在谷歌浏览器中找到当前版本信息。 打开“设置”&#xff0c;点击“关于谷歌”即可看到版本号。确保后续下载的Chromedriver版本与Chrome浏览器版本一致。或者直接跳转网页地址&#xff1a;chrome://settings/help 2. 下载Chromedri…

js逆向第12例:猿人学第5题js混淆-乱码增强

文章目录 那么`RM4hZBv0dDon443M=`是怎么来的?密钥怎么找加密数组怎么破解_0x4e96b4[_$pr]m=,f=时间戳是哪个?打开控制台查看数据接口 https://match.yuanrenxue.cn/api/match/5?page=2&m=1704439385499&f=1704439384000 利用postman测试接口请求,判断参数是否强…

机器学习 - 决策树

场景 之前有说过k近邻算法&#xff0c;k近邻算法是根据寻找最相似特征的邻居来解决分类问题。k近邻算法存在的问题是&#xff1a;不支持自我纠错&#xff0c;无法呈现数据格式&#xff0c;且吃性能。k近邻算法的决策过程并不可视化。对缺失数据的样本处理很不友好&#xff0c;…

C++ OpenGL 3D GameTutorial 1:Making the window with win32 API学习笔记

视频地址https://www.youtube.com/watch?vjHcz22MDPeE&listPLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzg 一、入口函数 首先看入口函数main代码&#xff1a; #include<OGL3D/Game/OGame.h>int main() {OGame game;game.Run();return 0; } 这里交代个关于C语法的问题&#x…

MidJourney笔记(10)-faq-fast-help-imagine-info-public-stealth

/faq 在官方 Midjourney Discord 服务器中使用可快速生成流行提示工艺频道常见问题解答的链接。 不过这个命令,我也是没有找到入口,之前还能在MidJourney的频道里使用,然后最近发现没有权限,有点奇怪。不知道系统又做了什么升级。 /fast 切换到快速模式。

七、HTML 文本格式化

一、HTML 文本格式化 加粗文本斜体文本电脑自动输出 这是 下标 和 上标 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>HTML文本格式化</title> </head><body><b>加粗文本</b><br>…

HarmonyOS应用开发学习笔记 包名、icon图标,应用名修改 UIAbility组件介绍、UIAbility启动模式、UIAbility组件基本用法

目前HarmonyOS应用主推的是Stage模型开发 一、Stage模型基本概念 项目描述UIAbility组件UIAbility组件是一种包含UI界面的应用组件&#xff0c;主要用于和用户交互。例如&#xff0c;图库类应用可以在UIAbility组件中展示图片瀑布流&#xff0c;在用户选择某个图片后&#xf…

Mysqld的关键优化参数

skip-name-resolve 现象 mysql连接很慢&#xff0c;登陆到服务器上查看服务器日志都是正常的&#xff0c;无可疑记录&#xff0c;登陆到mysql服务器上&#xff0c;查看下进程&#xff0c;发现有很多这样的连接&#xff1a; 218 | unauthenticated user | 192.168.10.6:44500 |…

Stable Diffusion架构的3D分子生成模型 GeoLDM - 测评与代码解析

之前&#xff0c;向大家介绍过3D分子生成模型 GeoLDM。 GeoLDM按照Stable Diffusion架构&#xff0c;将3D分子生成的扩散过程运行在隐空间内&#xff0c;优化了基于扩散模型的分子生成。可能是打开Drug-AIGC的关键之作。让精确控制分子生成有了希望。 详见&#xff1a;分子生成…

听GPT 讲Rust源代码--compiler(16)

File: rust/compiler/rustc_span/src/lib.rs 在Rust源代码中&#xff0c;rust/compiler/rustc_span/src/lib.rs文件定义了与Rust编译器源代码位置相关的数据结构和功能。 下面是对一些重要结构和枚举类型的详细介绍&#xff1a; SessionGlobals: 代表编译器会话&#xff08;Ses…

leetcode2975. 移除栅栏得到的正方形田地的最大面积

题目 有一个大型的 (m - 1) x (n - 1) 矩形田地&#xff0c;其两个对角分别是 (1, 1) 和 (m, n) &#xff0c;田地内部有一些水平栅栏和垂直栅栏&#xff0c;分别由数组 hFences 和 vFences 给出。 水平栅栏为坐标 (hFences[i], 1) 到 (hFences[i], n)&#xff0c;垂直栅栏为…

【大数据进阶第三阶段之Hive学习笔记】Hive查询、函数、性能优化

【大数据进阶第三阶段之Hive学习笔记】Hive安装-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive常用命令和属性配置-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive基础入门-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive查询、函数、性能优化-CSDN博客 ——…

2024.1.2 Spark 简介,架构,环境部署,词频统计

目录 一. Spark简介 二 . Spark 框架模块 三. 环境准备 3.1 Spark Local模式搭建 3.2 通过Anaconda安装python3环境 3.3 PySpark库安装 四 . Spark集群模式架构介绍 五. pycharm远程开发环境 六. Spark词频统计 一. Spark简介 1. Spark 和MapReduce MR:大量的磁盘反复…

LiveGBS流媒体平台GB/T28181常见问题-国标编号是什么设备编号和通道国标编号标记唯一的摄像头|视频|镜头通道

LiveGBS国标GB28181中国标编号是什么设备编号和通道国标编号标记唯一的摄像头|视频|镜头通道 1、什么是国标编号&#xff1f;2、国标设备ID和通道ID3、ID 统一编码规则4、搭建GB28181视频直播平台 1、什么是国标编号&#xff1f; 国标GB28181对接过程中&#xff0c;可能有的小…

Vue入门一(前端发展史|Vue介绍|Vue插值语法|Vue指令|style与class使用|条件渲染)

文章目录 一、前端的发展史二、Vue介绍 和 基本使用1) Vue介绍2) Vue特点3) M-V-VM思想1.MVVM介绍2.MVVM的特性3.MVVM逻辑 4) 组件化开发、单页面开发组件化开发单页面开发 5) 引入方式6) 补充解释型的语言是需要解释器的 nodejs&#xff1a;一门后端语言7) 快速使用 三、Vue之…
最新文章