求解视觉里程计(基于特征点法)

2023-11-17

1 视觉里程计(VO)

视觉SLAM的基本框架已经学习,其中由两部分非常重要,那就是前端和后端。视觉前端就被成为视觉里程计(VO),其根据相邻图像的信息,估计出粗略的相机位姿,给后端提供较好的位姿初始值。

视觉里程计的实现方法分两种:
①对图像提取特征点的特征点法
②不对图像进行特征提取的直接法

基于特征点法的前端,长久以来(直到现在)被认为是视觉里程计的主流方法。它运行稳定,对光照、动态物体不敏感,是目前比较成熟的解决方案。
所以先来学习下特征点法。

2 基于特征点法的视觉里程计算法

基于特征点法的视觉里程计的工作原理是:

首先,从图像中提取特征点。特征点在相机视角发生少量变化后会保持不变
然后,在其他图像中匹配这些相同的特征点,根据位姿估计算法估计相机的位姿以及特征点的空间位置。这些点被称为路标点,也就是图像特征

2.1 特征点

通过对视觉里程计的工作原理的了解,我们可以知道,特征点在相机少量运动之后需要保持稳定。让计算机能在以后的图像序列中重新找到那个点,然后产生关联。这样我们才能设计算法求出两帧图像帧之间对应的相机运动。

现在已经出现了很多关于特征点的研究,比如SIFT,SURF,ORB等,他们有以下良好的性质:

1、可重复性:可以在不同的图像中找到。
2、可区别性:不同的特征点有不同的表达。
3、高效率:同一图像中,特征点数量远小于像素的数量(在能够明显表示此图像特征的情况下用更少的像素信息,这可以在后面的计算中显著提高计算效率)。
4、局部性:特征点仅可以表示一小片图像区域。

特征点由关键点描述子两部分组成。可以这样说:关键点是指该特征点在图像里的位置,有些特征点还具有朝向、大小等信息。描述子通常是一个向量,按照某种人为设计的方式,描述了该关键点周围像素的信息。所以只要两个特征点的描述子在向量空间上距离相近,就可以认为他们是相同的特征点。

前面说现在已经有了很多著名的特征点,其中ORB特征点在视觉SLAM领域应用最多。因为ORB特征点在保持了特征子具有旋转,尺度不变性的同时,速度方面提升明显,对于实时性要求很高的 SLAM来说是一个很好的选择。

2.2 ORB特征点的提取与匹配

ORB特征点全称为“Oriented FAST and Rotated BRIEF ”,是一种改进的FAST角点。带有旋转不变性和尺度不变性
下面看它是怎么带有旋转不变性和尺度不变性的。


提取 ORB 特征分为两个步骤:

  1. FAST 角点提取:找出图像中的” 角点”。相较于原版的 FAST, ORB 中计算了特征点的主方向,为后续的 BRIEF 描述子增加了旋转不变特性
  2. BRIEF 描述子:对前一步提取出特征点的周围图像区域进行描述。

2.2.1 关键点与描述子

在这里插入图片描述
FAST角点不具有方向性,相机旋转一下就变成了别的特征点。它以固定半径3的圆选取像素点进行比较,这使得相近在远近运动时,特征点也改变了。
针对 FAST 角点不具有方向性和尺度的弱点,ORB 添加了尺度和旋转的描述
尺度不变性由构建图像金字塔,并在金字塔的每一层上检测角点来实现。
特征的旋转是由灰度质心法实现的。

图像金字塔比较容易理解,指对图像进行不同层次的降采样,以获得不同分辨率的图像。来表示相机离特征点远近这么一个感觉。
在这里插入图片描述


灰度质心法

用灰度质心法解决其旋转问题。

  1. 第1步:我们定义该区域图像的矩为:
    在这里插入图片描述
    其中, p , q p,q p,q取0或1; I ( x , y ) I(x,y) I(x,y)表示在像素坐标 ( x , y ) (x,y) (x,y)处图像的灰度值; m p q m_{pq} mpq表示图像的矩。
    在半径为 R R R的圆形图像区域,沿两个坐标轴 x , y x,y x,y方向的图像矩分别为:在这里插入图片描述
    圆形区域内所有像素的灰度值总和为:
    在这里插入图片描述

  2. 第2步:求出图像的质心为:
    在这里插入图片描述

  3. 第3步:然后关键点的“主方向”就可以表示为从圆形图像形心 O O O 指向质心 C C C的方向向量 O C ⃗ \vec{OC} OC ,于是关键点的旋转角度记为:
    在这里插入图片描述

用图表示上面这个过程就是:在这里插入图片描述
这样每个关键点都带有这么一个角度信息,相机旋转时程序实时计算每个特征点的角度信息,然后旋转回去再对两个特征点进行比较,不就好比较了嘛。

特征描述子计算

B R I E F BRIEF BRIEF 是一种二进制描述子,它的描述向量由许多个 0 和 1 组成,这里的 0 和 1 编码了关键点附近两个像素(比如说 p p p q q q)的大小关系:如果 p p p q q q 大,则取 1,反之就取 0。
B R I E F BRIEF BRIEF算法的核心思想是在关键点 P P P的周围以一定模式选取 N N N个点对,把这 N N N个点对的比较结果组合起来作为描述子
那么,具体的两个像素 p p p q q q该怎么选呢?
为了保持踩点固定,工程上采用特殊设计的固定的 p a t t e r n pattern pattern来做。下面是几种 p a t t e r n pattern pattern
在这里插入图片描述
原始的 BRIEF 描述子是不具有旋转不变性的,因此在图像发生旋转时容易丢失。而 ORB 在 FAST 特征点提取阶段计算了关键点的方向,所以可以利用方向信息,计算了旋转之后的“Steer BRIEF”特征,使 ORB 的描述子具有较好的旋转不变性。

2.2.2 特征点匹配

特征匹配就是确定当前看到的路标与之前看到的路标之间的对应关系,也就是SLAM中的数据关联问题。通过对图像与图像,或者图像与地图之间的描述子进行准确的匹配,我们可以为后续的姿态估计,优化等操作减轻大量负担。

毋庸置疑,特征匹配的准确性决定了视觉SLAM的位姿估计性能,然而由于图像特征的局部特性,误匹配的情况广泛存在,而且长期以来一直没有得到有效解决,目前已经成为视觉 SLAM 中制约性能提升的一大瓶颈。比如在ORB-SLAM中作者就花费了大量的计算和技巧去剔除误匹配。
描述子距离表示了两个特征之间的相似程度,不过在实际运用中还可以取不同的距离度量范数。对于二进制的描述子,使用汉明距离(Hamming distance)做为度量。两个二进制串之间的汉明距离,指的是它们不同位数的个数
对应在 SLAM 中的实时性需求,基于快速近似最近邻(FLANN)算法可以实时匹配大量的特征点。可以通过 O p e n C V OpenCV OpenCV实现。
效果图:
在这里插入图片描述

2.3 特征点法估计相机位姿

上面我们进行了特征点的匹配,说解决了视觉SLAM中的数据关联问题,那这有什么用呢?—那就是求解相机运动。

如果我们有若干对这样的匹配点,就可以通过这些二维图像点的对应关系,恢复出在两帧之间相机的运动。

2.3.1 对极几何约束

注意:这里是通过两张图象的二维图像点恢复相机运动。(2D-2D)
假设我们从两张图像中,得到了一对配对好的特征点 p 1 , p 2 p_1,p_2 p1,p2,假定匹配完全正确,那么 p 1 , p 2 p_1,p_2 p1,p2就是 P P P分别在两帧上的投影,如下图,这就是我们熟悉的对极几何约束在这里插入图片描述
假设相机从 O 1 O_1 O1运动到 O 2 O_2 O2,我们求解两帧之间的运动 R , t R,t R,t

在第一帧的相机坐标系下,设 P P P 的空间位置为:
在这里插入图片描述
根据针孔相机模型,两个像素点 p1, p2 的像素位置为:在这里插入图片描述
变成齐次坐标的形式:
在这里插入图片描述
等式两边乘以 K − 1 K^{-1} K1,就是将像素坐标系的点反投影到归一化平面上:在这里插入图片描述
p 1 , p 2 p_1,p_2 p1,p2 的关系不难得到:
在这里插入图片描述
两边同时乘以 t t t^
在这里插入图片描述
^这个符号之前说过是反对称的意思,也是做叉积的意思
然后,两侧同时左乘 x 2 T x_2^T x2T:
在这里插入图片描述
注意观察左式
t t t x 2 x_2 x2作叉积之后,就是一个垂直于 x 2 x_2 x2 的向量,然后再与 x 2 x_2 x2 做内积,结果是 0 0 0,即
在这里插入图片描述
再将 p 1 , p 2 p_1,p_2 p1,p2 带入,
在这里插入图片描述
上面两个式子都叫对极约束
再进一步简化,定义
在这里插入图片描述
得到简化形式的对极约束:
在这里插入图片描述
定义的这两个矩阵, E E E称为本质矩阵, F F F称为基础矩阵

很明显他两者之间就差了一个相机内参。由于我们做视觉SLAM一般会提前标定相机内参,所以我们只需要从本质矩阵 E E E着手求解 R , t R,t R,t即可。

关于视觉SLAM中相关的几个矩阵的自由度和秩分析,可以看我的另一篇博客

2.3.2 八点法求解本质矩阵E,估计相机运动

我们将2.3.1中的归一化坐标设为:
在这里插入图片描述
根据对极约束有:
在这里插入图片描述
充分展开上式就可以得到带有 E E E 的向量形式 e e e 的等式。
在这里插入图片描述

在这里插入图片描述
将八对匹配点带入对极约束可以得到一个线性方程组。
在这里插入图片描述
接下来的问题是如何根据已经估得的本质矩阵 E E E,恢复出相机的运动 R , t R, t R,t这个过程是由奇异值分解(SVD)得到的。
E E E S V D SVD SVD 分解形式为:
在这里插入图片描述
其中 U , V U,V U,V 为正交阵, Σ Σ Σ 为奇异值矩阵。
S V D SVD SVD 分解中,对于任意一个 E E E,存在两个可能的 t , R t, R t,R 与之对应:
在这里插入图片描述
其中 R Z ( π / 2 ) R_Z(\pi/2) RZ(π/2) 表示沿 Z Z Z 轴旋转 90 90 90 度得到的旋转矩阵。同时,由于 − E −E E E E E 等价,所以对任意一个 t t t 取负号,也会得到同样的结果。这使得通过 S V D SVD SVD 分解可以得到四组解,分别对应下方四种情况。
在这里插入图片描述
很显然,只有第一种情况两个相机观察到的点在各帧坐标系中的深度值是正的。所以我们可以通过把任意一点带入解中,然后判断其深度值是否为正即可。

非常感谢您的阅读并期待您加入!

期待您加入我的微信公众号-“过千帆”,那里除了技术文章之外,还有我的读书分享同样希望能帮到您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

求解视觉里程计(基于特征点法) 的相关文章

  • python os.walk不递归_python-os.walk目录递归

    递归删除文件或目录 递归 os walk 删除目录 shutil rmtree 1 coding UTF 8 2 importos path sys shutil3 4 path H test 5 6 7 for root dirs fil
  • 敏捷之旅大连站2012第一次筹备会议记录

    昨天召集了敏捷之旅大连站的几位组织者 一起开了一个筹备的讨论会 简单记录如下 1 地点的讨论 目前有几个地点备选 东软会议中心 腾飞软件园的会议厅 中荷人寿会议室以及酒店 综合各种因素 包括地点的交通 午餐的方便程度 场地的大小 音响和投影

随机推荐

  • 2.C++设计模式 - 观察者模式

    class Observer public 构造 Observer 析构 virtual Observer 更新 virtual void updata class Server private 观察者链表 list
  • 微信多客服如何设置快捷回复(高级玩法总结)

    在微信生态 使用公众号小程序等 同时每天会产生很多重复的咨询 如何在微信上实现更高效的快捷回复 把常用语 回答文档等便捷化 标准化对答 避免以往的复制粘贴工作方式 是我们不得不面对的一个问题 应用内回复 全应用回复 个人回复 公共回复 快捷
  • Hadoop - wordCount 实例

    hadoop 创建文件夹存放需要被统计的文件 hadoop fs mkdir usr 创建单子文件并写入内容 可在网上找几篇英文文章写入 vim word txt 上传到 hdfs hadoop fs put word txt usr 利用
  • C#开发学习~~~“未能找到类型或命名空间名称“XXXX”(是否缺少 using 指令或程序集引用?)”

    引言 在 C 高阶编程 中文第10版 的2 2 4节中 有这样一段描述 看到这段话 我简单的理解为 只要在程序开始用using语句声明名称空间 就可以在当前名称空间使用声明的这个名称空间中的类和方法 但实践证明我的理解是有些错误的T0T 问
  • [坑]拦截器返回response.getWrite().println方法返回数据不全

    在SpringBoot项目中 前端ajax请求后端 拦截器进行登录拦截判断 如果超时返回false 则给前端返回一段json字符串 private static void returnJson HttpServletResponse res
  • C++ cin 实现循环读入

    习惯了使用while scanf d x 来实现循环读入 但是有时候使用泛型编程的时候就必须使用C 中的cin 但是当我想要实现循环读入的时候却发现有些困难 我们可以看一下下面这个简单的例子 include
  • 使用boost::units库进行信息单位转换的C++示例程序

    使用boost units库进行信息单位转换的C 示例程序 include
  • 电视机尺寸与观看距离

    电视机尺寸是指电视机屏幕对角线的长度 以英寸为单位 1英寸 2 54厘米 而且目前来看大多数液晶电视的标准屏幕比已经变成了宽的是16 9 根据勾股定理 对角线的长度是 337 根号337 开放得出 屏幕高度与对角线的比值就是9 337 一般
  • 【新版】系统架构设计师 - 案例分析 - 信息安全

    个人总结 仅供参考 欢迎加好友一起讨论 文章目录 架构 案例分析 信息安全 安全架构 安全模型 分类 BLP模型 Biba模型 Chinese Wall模型 信息安全整体架构设计 WPDRRC模型 各模型安全防范功能 网络安全体系架构设计
  • Linux中创建文件夹,删除文件夹

    Linux中创建目录 mkdir 文件夹 比如 mkdir test 删除文件夹 rm rf 文件夹 比如 rm rf soft vi强制不保存退出命令 q
  • const 定义数组问题

    const keysArr array aaa gt 11111 bbb gt 22222 ccc gt 33333 ddd gt 44444 上面是标准的错误格式 PHP编译不会报详细错误信息 500 查找半天的代码问题 一直未发现错误
  • 解决Jenkins构建前端时node-sass的.node文件下载报错问题的一种方案

    问题背景 公司的npm仓库未跟外网联通 为什么不联通 我也好鸡儿纳闷 使用Jenkins构建前端时 会在下载node sass的 node时报错 默认情况下会从github上去下 node文件 当然也可以通过配置 npmrc文件指定下载路径
  • 浅析Jetty与tomcat区别

    一 Jetty介绍 1 Jetty概述 Jetty是一个开源项目 最初由Mort Bay Consulting公司创建 它的目标是提供一个快速 灵活 可嵌入的Web服务器和Servlet容器 使Java开发人员能够轻松构建高性能的Web应用
  • 如何在 Mac 上录制屏幕?mac录屏教程分享

    您可以为整个屏幕或屏幕上的选定部分录制视频 1 使用 截屏 工具栏 要查看 截屏 工具栏 请同时按下以下三个按键 Shift Command 和 5 您将看到用于录制整个屏幕 录制屏幕的选定部分或拍摄屏幕静态图像的屏幕控制项 录制整个屏幕
  • 泛型的概念

    一 什么是泛型 参数化类型 为什么要引入泛型 1 将不同类型的数据添加到Arraylist中 取出数据要使用时 要进行强制转换 还原 向下转型 2 同时在编写程序时 不会报错 无类型安全监测机制 而结果出错ClassCastExceptio
  • 摄像头在H5的实时播放功能实现历程

    一 问题解决的路程 1 需求来源 因项目发展需求 需要在3D地图上进行实时摄像头监控展示 3D地图是基于浏览器H5页面展示的 在H5页面实时播放摄像头监控就需要可以直接拿到取流地址进行直接播放 以下各大摄像头产商取流方式 海康威视 默认IP
  • 网络层

    网络层 从它的名字可以看出 它解决的是网络与网络之间 即网际的通信问题 而不是同一网段内部的事 用于网络互联的设备都处于网络层 如 路由器 网络交互机等 一个底层网络内部只存在两层 即数据链接层 与 物理层 没有其它层
  • 考研C++/C数据结构之单链表两种查找方法

    继上篇文章我们探讨了单链表的两种创建方法 头插法和尾插法 今天我们来学习一下单链表的两种查找方法 按序查找和按值查找 按序查找的代码实现如下 按位查找 LinkList GetElem LinkList L int i int j 1 Li
  • python是真刑啊!爬虫这样用,离好日子越铐越近了~

    一个程序员写了个爬虫程序 整个公司200多人被端了 不可能吧 刚从朋友听到这个消息的时候 我有点不太相信 做为一名程序员来讲 谁还没有写过几段爬虫呢 只因写爬虫程序就被端有点夸张了吧 朋友说 消息很确认并且已经进入审判阶段了 01 对消息进
  • 求解视觉里程计(基于特征点法)

    目录 1 视觉里程计 VO 2 基于特征点法的视觉里程计算法 2 1 特征点 2 2 ORB特征点的提取与匹配 2 2 1 关键点与描述子 灰度质心法 特征描述子计算 2 2 2 特征点匹配 2 3 特征点法估计相机位姿 2 3 1 对极几