基于matlab处理来自立体相机图像数据构建室外环境地图并估计相机的轨迹(附源码)

news2024/7/4 4:32:35

一、前言

视觉同步定位和映射 (vSLAM) 是指计算摄像机相对于周围环境的位置和方向,同时映射环境的过程。该过程仅使用来自相机的视觉输入。vSLAM 的应用包括增强现实、机器人和自动驾驶。vSLAM 只需使用单眼摄像头即可执行。但是,由于使用单个相机无法准确计算深度,因此地图的比例和估计的轨迹是未知的,并且会随时间漂移。

此外,要引导系统,需要多个视图来生成初始地图,因为它不能从第一帧开始三角测量。使用立体摄像头可以解决这些问题,并提供更可靠的 vSLAM 解决方案。此示例演示如何处理来自立体相机的图像数据,以构建室外环境的地图并估计相机的轨迹。该示例使用 ORB-SLAM2算法的版本,该算法基于功能并支持立体摄像机。

二、处理管道概述

立体 vSLAM 的管道与单目视觉同时定位和映射示例中的单目 vSLAM 管道非常相似。主要区别在于,在地图初始化阶段,三维地图点是从同一立体对的一对立体图像创建的,而不是从不同帧的两个图像创建的。

  • 地图初始化:管道首先使用视差图从一对立体图像初始化 3-D 点的地图。左侧图像存储为第一个关键帧。

  • 跟踪:初始化地图后,对于每个新的立体对,通过将左图中的特征与最后一个关键帧中的特征进行匹配来估计相机的姿势。通过跟踪本地地图来优化估计的相机姿势。

  • 局部映射:如果将当前左侧图像标识为关键帧,则会根据立体对的视差计算新的 3-D 地图点。在此阶段,使用束调整通过调整相机姿势和 3D 点来最小化重投影错误。

  • 闭环:通过使用功能袋方法将每个关键帧与所有先前的关键帧进行比较来检测每个关键帧的循环。一旦检测到闭环,就会优化姿势图以优化所有关键帧的相机姿势。

三、下载并浏览输入立体图像序列

此示例中使用的数据来自多伦多大学航空航天研究所提供的 UTIAS 长期定位和映射数据集。您可以使用 Web 浏览器或运行以下代码将数据下载到目录。

使用两个图像数据存储对象来存储立体图像。

四、地图初始化

ORB-SLAM 管道首先初始化包含三维世界点的地图。此步骤至关重要,对最终 SLAM 结果的准确性有重大影响。初始 ORB 特征点对应关系是使用立体对的两个图像之间的匹配特征找到的。匹配的对应满足以下约束:

  • 整流立体对图像中两个对应特征点之间的水平偏移小于最大视差。您可以从立体对图像的立体立体浮雕中确定近似的最大视差值。

  • 整流立体对图像中两个对应特征点之间的垂直偏移小于阈值。

  • 匹配要素的比例几乎相同。

与匹配特征点对应的 3-D 世界位置确定如下:

  • 使用选择视差范围,通过半全局匹配 (SGM) 方法计算每对立体图像的视差图。

  • 使用函数根据视差图计算三维世界点坐标。

  • 在视差地图中查找与要素点及其 3-D 世界位置相对应的位置。

五、数据管理和可视化

使用第一个立体对初始化地图后,可以使用 函数来存储第一个关键帧和相应的地图点。

六、初始化地点识别数据库

循环检测是使用词袋方法执行的。表示为对象的视觉词汇表是离线创建的,其 ORB 描述符是从数据集中的大量图像中提取的。

七、跟踪

跟踪过程使用每一对执行,并确定何时插入新关键帧。

每个帧的处理方式如下:

  1. 为每个新的立体图像对提取 ORB 特征,然后匹配,与最后一个关键帧中具有已知相应 3-D 地图点的特征进行匹配。

  2. 使用透视n点算法估计相机姿势。

给定相机姿势,将最后一个关键帧观察到的地图点投影到当前帧中,并使用函数搜索要素对应关系。

  1. 使用当前帧中的 3D 到 2-D 对应关系,通过使用 执行仅运动束调整来优化相机姿势。

  2. 将本地地图点投影到当前帧中,以使用 搜索更多要素对应关系,并使用 再次优化相机姿势。

  3. 跟踪的最后一步是确定当前帧是否应为新的关键帧。如果同时满足以下两个条件,则帧是关键帧:

  • 自最后一个关键帧以来至少经过了 5 个帧,或者当前帧跟踪的地图点少于 80 个。

  • 当前帧追踪的地图点小于参考关键帧追踪点的 90%。

如果当前帧要成为关键帧,请继续执行本地映射过程。否则,请启动下一帧的跟踪。

八、本地映射

对每个关键帧执行本地映射。确定新关键帧后,将其添加到关键帧并更新新关键帧观察到的地图点的属性。为确保包含尽可能少的异常值,必须在至少 3 个关键帧中观察到有效的地图点。

新地图点是通过对当前关键帧及其连接的关键帧中的 ORB 要素点进行三角测量来创建的。对于当前关键帧中的每个不匹配特征点,使用 搜索与连接的关键帧中其他不匹配点的匹配项。局部束平差可细化当前关键帧的姿势、连接的关键帧的姿势以及在这些关键帧中观察到的所有地图点。

九、闭环

闭环步骤采用本地映射进程处理的当前关键帧,并尝试检测并闭合循环。通过使用查询数据库中与当前关键帧在视觉上相似的图像来标识循环候选项。如果候选关键帧未连接到最后一个关键帧,并且其相邻关键帧的三个是循环候选项,则该候选关键帧有效。

最后,对基本图应用姿态图优化以校正漂移。基本图是通过删除共可见性图中少于匹配项的连接在内部创建的。姿势图优化后,使用优化的姿势更新地图点的三维位置。

十、与地面真相比较

您可以将优化的相机轨迹与实际数据进行比较,以评估解决方案的准确性。下载的数据包含一个文件,用于存储每帧的 GPS 位置。您可以使用自动驾驶工具箱中的 自动驾驶工具箱或地图工具箱中测绘工具箱将 GPS 位置从地理坐标转换为本地笛卡尔坐标。在此示例中,您只需从 M 文件加载转换后的 GPS 数据即可。

十一、立体图像的密集重建

给定精细的相机姿势,您可以从与关键帧对应的立体图像中执行密集重建。

十二、程序

使用Matlab R2022b版本,点击打开。(版本过低,运行该程序可能会报错)

程序有偿获取:评论区下留言,博主看到会私信你。

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

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

相关文章

Spring系列3 -- 更简单的读取和存储对象

前言 上一篇章总结了,Spring的创建与使用,通过创建Maven项目配置Spring的环境依赖,创建Spring框架的项目,然后通过在Resource目录下创建Spring-config.xml配置文件,添加<bean></bean>标签将我们需要的bean对象注入到容器中,然后通过ApplicationContext获取Spring上…

Mybatis-puls——条件查询的三种格式+条件查询null判定+查询投影

前言 在mybatis_plus的封装中的Wrapper<T>接口参数就是用于封装查询条件 在测试类中启动如上一个简单的查询&#xff0c;然后控制台运行会输出一大堆无关日志&#xff0c;这里先把这些日志关闭 去除无关日志文件 先新建一个XML配置文件 然后变成如下&#xff0c;这里…

[神经网络]YoloV7

Yolo系列是一类很经典的目标检测网络&#xff0c;属于anchor-base型网络&#xff0c;即需要先产生先验框然后筛选先验框得到预测框。同时它也是One-Stage网络&#xff0c;即不需要额外的网络结构来筛选先验框。这两种特点使得它具备了运算速度快和计算精度相对较高的特点。 比较…

Win10怎么用U盘重装系统?Win10用U盘重装系统步骤图解教程

Win10怎么用U盘重装系统&#xff1f;使用U盘重装系统是一种快速而有效的方法&#xff0c;可以帮助我们在电脑中进行Win10系统的重新安装。首先用户需要准备一个容量适当的U盘&#xff0c;并确保其中没有重要数据&#xff0c;然后按照小编分享的Win10用U盘重装系统步骤图解教程操…

Redis 简单入门

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 安装 Redisredis 的数据类型和使用字符串类型字典类型列表类型集合类型有序集合类型 SpringBoot 集成 Redis添加 redis 依赖配…

el-checkbox / el-checkbox-group中绑定对象无法回显的问题处理

在使用el-checkbox / el-checkbox-group时&#xff0c;发现若label绑定的是对象&#xff0c;则是无法回显的&#xff0c;参考了很多方法&#xff0c;但大多都无法解决&#xff0c;最终参考下面的方法解决&#xff0c;记录一下。 <el-checkbox :label"JSON.stringify(i…

每天一点Python——day51

#第五十一天列表和字典为可变序列&#xff0c;元组是不可变序列 为什么要将元组设计成不可变序列呢&#xff1f; 一旦创建了不可变类型的对象&#xff0c;对象内部的所有数据将不能被修改 这样就避免了由于修改数据而导致的错误 对于不可变对象&#xff0c;在多任务环境下&…

最小覆盖串双指针解题思路及Java实现

最小覆盖串双指针解题思路及Java实现 题目双指针思路Java实现 题目 题目来自牛客NC28 最小覆盖子串 给出两个字符串 s 和 t&#xff0c;要求在 s 中找出最短的包含 t 中所有字符的连续子串。 例如&#xff1a; 输入&#xff1a;“XDOYEZODEYXNZ”,“XYZ” 返回值&#xff1a;“…

使用LiteSpeed缓存插件将WordPress优化到100%的得分

页面速度优化应该是每个网站所有者的首要任务&#xff0c;因为它直接影响WordPress SEO。此外&#xff0c;网站加载的时间越长&#xff0c;其跳出率就越高。这可能会阻止您产生转化并为您的网站带来流量。 使用正确的工具和配置&#xff0c;缓存您的网站可以显着提高其性能。因…

c++——命名空间

1.什么是命名空间 1.1命名空间的定义 命名空间&#xff08;Namespace&#xff09;是C中用来避免命名冲突的一种机制。命名空间可以将一组相关的函数、类、变量等定义在同一个逻辑分组中&#xff0c;从而避免它们与其他代码中的同名实体发生冲突。 C中&#xff0c;命名空间使用…

Openlayers实战:回显点、线段、圆形、多边形

Openlayers地图中,回显数据到地图上,形成几何图形是非常重要的一部分学习内容。 回显的内容基本单元包括点、线、圆形、多边形。本实战项目中,根据给定的坐标点,用最基础最管用的方式来显示这些信息。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑…

Keil环境下CANopenNode移植到STM32问题记录(一)---printf重定向问题

文章目录 问题描述问题结决思考&#xff1a;相关文章 在直接将CANopenSTM32的示例工程直接移植到Keil环境下。 如果移植工程未实现printf函数重定向&#xff0c;则要注释掉log_printf下面的printf函数&#xff0c;使日志打印失效 /* Printf function of CanOpen app */ #define…

Django_环境配置(一)

目录 一、安装Django 二、创建项目 三、创建应用 四、注册应用 五、使用mysql数据库 六、视图 七、开发服务器 源码等资料获取方法 一、安装Django # 在CMD中运行 pip install django # 查看djangp版本 python manage.py version 二、创建项目 # 在CMD中运行 django-a…

工业物联网安全监测解决方案:工业安全节能管理

工业自动化和工业化的快速发展&#xff0c;工厂安全问题越来越受到重视。工厂安全监测是保障工厂安全运行的关键技术之一&#xff0c;它可以及时发现并处理潜在的安全问题&#xff0c;防止事故的发生&#xff0c;保障员工的安全和工厂的正常运转。智能改造成为广大企业关注的热…

idea配置本地maven保姆级教程

一、说在前面 idea默认会带有maven插件&#xff0c;原则上是可以不需要配置的。但有个缺点&#xff0c;他是把本地仓库直接安装在了系统盘里面&#xff0c;随着时间的推移&#xff0c;仓库越来越大&#xff0c;笔记本的压力会比较大。 本文是下载自己的maven包&#xff0c;集…

DAY41:动态规划(一)动态规划理论基础

文章目录 DP概念以及和贪心的区别动规问题分类基础问题背包问题打家劫舍股票问题子序列问题 DP注意点解题步骤&#xff1a;五步debug考虑方向 视频课程&#xff1a;从此再也不怕动态规划了&#xff0c;动态规划解题方法论大曝光 &#xff01;| 理论基础 |力扣刷题总结| 动态规划…

3.1.cuda运行API-概述

目录 前言1. Runtime API概述总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习精简 CUDA 教程-Runtime API 概述 课程大纲可…

MachineLearningWu_3_LinearRegression

3 Linear Regression Linear Regression即是根据数据做出预测&#xff0c;如下&#xff0c; training set 如下&#xff1a; 在Linear Regression中你可以将(x&#xff0c; y)看做如下&#xff0c;每一行是一个sample&#xff0c;而每一列除最后一列是一个feature&#xff0c…

ESP32(掌控板) RGB灯控制

ESP32&#xff08;掌控板&#xff09; RGB灯控制 本程序实现了RGB灯亮度和颜色调节&#xff0c;通过触摸按键分别调节RGB值&#xff0c;通过机械按键选择要调节的灯或使用预设均通过调整变量的值加上判断实现。预设包含随机颜色和流水灯&#xff0c;各有高亮度和低亮度两种版本…

《Kali渗透基础》07. 弱点扫描(一)

kali渗透 1&#xff1a;漏洞发现1.1&#xff1a;Exploit-DB1.2&#xff1a;searchsploit1.3&#xff1a;nmap 2&#xff1a;漏洞管理3&#xff1a;弱点扫描类型4&#xff1a;漏洞基本概念4.1&#xff1a;CVSS4.2&#xff1a;CVE4.3&#xff1a;OVAL4.4&#xff1a;CCE4.5&#…