【视觉SLAM:六、视觉里程计Ⅰ:特征点法】
视觉里程计(Visual Odometry, VO)是通过处理图像序列,估计摄像头在时间上的相对位姿变化的技术。它是视觉SLAM的重要组成部分之一,主要通过提取图像中的信息(如特征点或直接像素强度)来实现相机运动估计。以下从特征点法、2D-2D对极几何、三角测量、3D-2D的PnP方法、3D-3D的ICP方法介绍视觉里程计的核心内容。
特征点法
特征点法是视觉里程计的经典方法,通过提取图像中的显著特征点,计算特征点之间的匹配关系,进而估计相机的运动。
特征点法简介
- 原理:提取图像中显著的特征点,并通过特征点的匹配关系推断相机运动。
- 流程:
- 提取图像特征点。
- 描述特征点并计算特征点匹配关系。
- 通过特征匹配估计相机运动(后续结合几何关系)。
ORB特征
- ORB(Oriented FAST and Rotated BRIEF)是一种高效的特征点提取和描述方法,常用于特征点法中。
- ORB特征点提取:基于FAST角点,结合图像金字塔提取多尺度特征点。
- ORB描述子:使用BRIEF描述子(特征点局部的二值编码)加快特征匹配。
- 优势:ORB特征兼具高效性和鲁棒性,且能处理旋转和尺度变化。
特征匹配
- 常用匹配算法:
- 暴力匹配:直接计算每对特征点描述子的距离(如欧氏距离、汉明距离),效率低。
- KNN匹配:为每个特征点找到最近的几个邻居,并通过比值测试筛选最佳匹配。
- 关键点均匀化:通过八叉树等方法均匀分布特征点,避免密集区域的冗余。
2D-2D对极几何
在特征点匹配基础上,2D-2D对极几何用于计算相机间的相对位姿。
对极约束
- 定义:在两幅图像中,某点 𝑝1 的匹配点 𝑝2 必定满足对极约束: p 2 ⊤ F p 1 = 0 \mathbf{p}_2^\top\mathbf{F}\mathbf{p}_1=0 p2⊤Fp1=0
其中 𝐹 是基础矩阵,描述两图像之间的几何关系。
本质矩阵
- 当相机的内参已知时,基础矩阵 𝐹可转化为本质矩阵 𝐸: E = K ⊤ F K \mathbf{E}=\mathbf{K}^\top\mathbf{F}\mathbf{K} E=K⊤FK
其中 𝐾 是相机的内参矩阵。
单应矩阵
- 对于静止的平面场景,匹配点间也可以通过单应矩阵 𝐻 建立关系: p 2 = H p 1 \mathbf{p}_2=\mathbf{H}\mathbf{p}_1 p2=Hp1
- 本质矩阵 vs 单应矩阵:
- 本质矩阵:适用于一般场景,包含视差信息。
- 单应矩阵:适用于平面场景或无视差运动,易退化。
位姿分解
通过分解本质矩阵 𝐸,可恢复相机的相对位姿(旋转矩阵 𝑅 和平移向量 𝑡)。
三角测量
三角测量是从两帧图像中匹配的特征点,恢复3D点坐标的关键技术。
原理
- 给定特征点在两帧图像中的投影位置 p 1 , p 2 \mathbf{p}_1,\mathbf{p}_2 p1,p2,以及相机的内参和位姿 𝑅,𝑡,通过以下方式恢复3D点: P = Triangulate ( p 1 , p 2 , R , t ) \mathbf{P}=\text{Triangulate}(\mathbf{p}_1,\mathbf{p}_2,\mathbf{R},\mathbf{t}) P=Triangulate(p1,p2,R,t)
- 基于几何投影模型,通过线性方程或非线性优化求解3D点坐标。
验证三角化结果
- 测量点是否位于相机前方。
- 计算重投影误差是否足够小。
3D-2D: PnP问题
PnP(Perspective-n-Point)问题是已知3D点和对应的2D投影,求解相机位姿的问题。
直接线性变换(DLT)
- 基于线性方程求解相机的位姿: p i = K [ R ∣ t ] P i \mathbf{p}_i=\mathbf{K}[\mathbf{R}|\mathbf{t}]\mathbf{P}_i pi=K[R∣t]Pi
- 通过线性求解,快速但精度不高。
P3P方法
- 给定3对3D点和2D点的匹配关系,利用几何关系直接求解位姿。
- 通常结合RANSAC算法,剔除外点,提高鲁棒性。
最小化重投影误差
通过非线性优化,最小化重投影误差以提高精度: x ∗ = arg min x ∑ i ∥ p i − h ( P i , x ) ∥ 2 \mathbf{x}^*=\arg\min_\mathbf{x}\sum_i\|\mathbf{p}_i-h(\mathbf{P}_i,\mathbf{x})\|^2 x∗=argxmini∑∥pi−h(Pi,x)∥2
其中 ℎ(⋅) 是投影函数。
3D-3D: ICP方法
3D-3D配准问题是已知两组3D点云,求解它们之间的刚体变换(旋转矩阵 𝑅 和平移向量 𝑡)。
SVD方法
- 基于点云的最近邻匹配,构造误差函数:
E ( R , t ) = ∑ i ∥ q i − ( R p i + t ) ∥ 2 E(\mathbf{R},\mathbf{t})=\sum_i\|\mathbf{q}_i-(\mathbf{R}\mathbf{p}_i+\mathbf{t})\|^2 E(R,t)=i∑∥qi−(Rpi+t)∥2
其中 p i \mathbf{p}_i pi和 q i \mathbf{q}_i qi 是两帧中的对应3D点。 - 使用奇异值分解(SVD)求解最优刚体变换。
非线性优化方法
- 在初始位姿的基础上,利用非线性优化方法(如高斯-牛顿或LM算法)进一步减少误差,提高精度。
- 优化目标:最小化点到点或点到平面的距离误差。
总结
视觉里程计通过特征点法提取信息,结合几何约束(2D-2D对极几何、三角测量)估计相机位姿,并通过PnP(3D-2D)和ICP(3D-3D)实现更复杂场景下的位姿求解。这些方法构成了视觉里程计的核心技术体系,为SLAM中的前端跟踪提供了坚实的数学基础和实现方案。
相关文章:
【视觉SLAM:六、视觉里程计Ⅰ:特征点法】
视觉里程计(Visual Odometry, VO)是通过处理图像序列,估计摄像头在时间上的相对位姿变化的技术。它是视觉SLAM的重要组成部分之一,主要通过提取图像中的信息(如特征点或直接像素强度)来实现相机运动估计。以…...
Python 数据结构揭秘:栈与队列
栈(Stack) 定义 栈是一种后进先出(Last In First Out, LIFO)的数据结构。它类似于一个容器,只能在一端进行插入和删除操作。栈有两个主要的操作:push(入栈)和 pop(出栈…...
常见的框架漏洞
1.Thinkphp Thinkphp5x远程命令执行及getshell 搭建靶场 cd vulhub/thinkphp/5-rce docker-compose up -d 首页 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖,通过覆盖类的核心属性filter导致rce,其攻击点较为多&…...
在C++中实现一个能够捕获弹窗、检查内容并在满足条件时点击按钮的程序;使用python的方案
在C中实现一个能够捕获弹窗、检查内容并在满足条件时点击按钮的程序是相当复杂的,因为C本身并不直接提供高级的GUI自动化功能。通常,这样的任务会使用Windows API(如User32.dll中的函数)或者一些第三方库(如UIAutomati…...
《Vue3实战教程》26:Vue3Transition
如果您有疑问,请观看视频教程《Vue3实战教程》...
【架构设计(一)】常见的Java架构模式
常见的 Java 架构模式解析 在 Java 开发领域,选择合适的架构模式对于构建高效、可维护且能满足业务需求的软件系统至关重要。本文将深入探讨几种常见的 Java架构模式,包括单体架构与微服务架构、分层架构与微服务架构的对比,以及事件驱动架构…...
自定义有序Map
package cn.ziqirj.common.utils;import lombok.Getter; import lombok.Setter;import java.util.ArrayList; import java.util.List;/*** 模拟Map集合,key不可重复,按插入顺序排序* author zhangji** param <T>*/ public class CustomOrderlyMap&…...
Jenkins(持续集成与自动化部署)
Jenkins 是一个开源软件项目,是基于Java开发的一种持续集成工具。 官网:https://www.jenkins.io/ GitLab安装使用 安装前提:内存至少需要4G 官方网站:https://about.gitlab.com/ 安装文档:https://docs.gitlab.c…...
redis7基础篇2 redis的哨兵模式2
目录 一 哨兵模式 1.1 redis的哨兵模式作用 1.2 redis的哨兵模式架构 1.3 redis的哨兵模式参数说明 二 redis的哨兵模式搭建 2.1 redis的主从复制模式 2.2 redis的sentinel配置文件 2.3 redis的实例节点和sentinel节点启动 3.3 redis的哨兵模式原理 3.3.1 redis的哨兵…...
windows终端conda activate命令行不显示环境名
问题: 始终不显示环境名 解决 首先需要配置conda的环境变量 确保conda --version能显示版本 然后对cmd进行初始化,如果用的是vscode中的终端,那需要对powershell进行初始化 Windows CMD conda init cmd.exeWindows PowerShell conda …...
SpringBoot 2.6 集成es 7.17
引言 在现代应用开发中,Elasticsearch作为一个强大的搜索引擎和分析引擎,已经成为许多项目不可或缺的一部分。Spring Boot作为Java生态中最受欢迎的微服务框架之一,其对Elasticsearch的支持自然也是开发者关注的焦点。本文将详细介绍如何在S…...
加固服务器有什么用?
为什么越来越多的企业和个人都在加固他们的服务器?加固服务器不仅可以保护数据安全,还能提升整体系统的稳定性和可靠性。下面是聚名网的一些介绍。 加固服务器的首要目的就是提高安全性。随着网络攻击手段的不断演变,黑客和恶意软件的威胁也…...
Personal APP
1、Matlab 2023b https://www.bilibili.com/opus/887246540317392920 https://blog.csdn.net/qq_25719943/article/details/138096918 https://www.jokerdown.com/22886.html 2、 3、...
探索最新的编程技术趋势:AI 编程助手和未来的编程方式
随着技术的飞速发展,编程技术领域在近年来经历了深刻的变革。从人工智能到低代码开发工具,新的技术趋势不断涌现,不仅大幅提高了开发效率,也重新定义了开发者的角色和工作方式。本篇博客将探讨几项当前最值得关注的编程技术&#…...
Android:文件管理:打开文件意图
三步走: 一、先在AndroidManifest.xml声明provider: <providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.FileProvider"android:exported"false"android:grantUriPermi…...
从纯虚类到普通类:提升C++ ABI兼容性的策略
在C编程中,纯虚类(也被称为抽象类)通常用于定义接口,而普通类则包含具体的实现。然而,在某些情况下,将纯虚类转换为普通类并提供默认实现,可以显著提升应用程序二进制接口(ABI&#…...
QT中如何限制 限制QLineEdit只能输入字母,或数字,或某个范围内数字等限制约束?
在 Qt 中,你可以通过多种方式来限制 QLineEdit 只能输入特定类型的字符,如字母、数字或某个范围内的数字。以下是一些常见的方法: 1. 使用输入验证器(QIntValidator, QDoubleValidator, QRegExpValidator) Qt 提供了…...
Tailwind CSS 使用简介
参考网站安装 - Tailwind CSS 中文网 号称是开始使用 Tailwind CSS 通过 npm 安装 tailwindcss,并创建你的 tailwind.config.js 文件。 npm install -D tailwindcss npx tailwindcss init 在 tailwind.config.js 文件中添加所有模板文件的路径。 /** type {im…...
iOS 逆向学习 - iOS Architecture Cocoa Touch Layer
iOS 逆向学习 - iOS Architecture Cocoa Touch Layer 一、Cocoa Touch Layer 简介二、Cocoa Touch Layer 的核心功能1. UIKit2. Event Handling(事件处理)3. Multitasking(多任务处理)4. Push Notifications(推送通知&…...
C语言实现库函数strlen
size_t是 unsigned int fgets会读入\n,用strcspn函数除去 assert判读指针是否为空指针,使用前要引头文件<assert.h> #include <stdio.h> #include <assert.h> size_t mystrlen(const char* str) {assert(str);size_t count 0;while …...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
