第八讲 视觉里程计2

不提取特征点计算VO:

  • 一是通过其他方式寻找配对点(光流法,跟踪特征点的运动),仍然使用特征点,只是把匹配描述子替换成了光流跟踪,估计相机运动仍使用对极几何、PnP或ICP算法。依然要求提取到的关键点有可区别性,即角点。
  • 二是无配对点(直接法,计算特征点在下一时刻图像中的位置),根据图像的像素灰度信息同时估计相机运动和点的投影,不要求提取到的点必须为角点。
  • 光流描述了像素在图像中的运动,而直接法则附带着一个相机运动模型。

目录

2、2D光流

Lucas-Kanade光流

3、实践:LK光流

4、直接法

直接法的推导

直接法的讨论


2、2D光流

光流是一种描述像素随时间在图像之间运动的方法。分为稀疏光流(Lucas-Kanade光流)和稠密光流(Horn-Schunck光流)。

Lucas-Kanade光流

  • 灰度不变假设:理想情况下,同一个空间点的像素灰度值,在各个图像中是固定不变的。I(x+dx,y+dy,t+dt)=I(x,y,t)
  • 对左边进行泰勒展开,保留一阶项:I(x+dx,y+dy,t+dt)\approx I(x,y,t)+\frac{\partial I}{\partial x}dx+\frac{\partial I}{\partial y}dy+\frac{\partial I}{\partial t}dt
  • 根据灰度不变等式,得到\frac{\partial I}{\partial x}dx+\frac{\partial I}{\partial y}dy+\frac{\partial I}{\partial t}dt=0,即\frac{\partial I}{\partial x}\frac{dx}{dt}+\frac{\partial I}{\partial y}\frac{dy}{dt}=-\frac{\partial I}{\partial t}
    • \frac{dx}{dt} 像素在x轴的运动速度,记为u
    • \frac{dy}{dt} 像素在y轴的运动速度,记为v
    • \frac{\partial I}{\partial x} 图像在该点处x方向的梯度,记为I_x
    • \frac{\partial I}{\partial y} 图像在该点处y方向的梯度,记为I_y
    • \frac{\partial I}{\partial t} 图像灰度对时间的变化量,记为I_t
  •  以上写成矩阵形式:\begin{bmatrix} I_x & I_y \end{bmatrix}\begin{bmatrix} u\\ v \end{bmatrix}=-I_t
  •  求解的是像素运动u,v。上式为二元一次方程,无法求解。必须引入额外的约束来计算u,v。LK光流中,假设某一个窗口内的像素具有相同的运动。考虑一个w×w的窗口,含有w^2数量的像素。该窗口内像素具有同样的运动,因此有w^2个方程:\begin{bmatrix} I_x & I_y \end{bmatrix}_k\begin{bmatrix} u\\ v \end{bmatrix}=-I_{tk},k=1,2,...,w^2
  • 简化后:A\begin{bmatrix} u\\ v \end{bmatrix}=-b。这是关于u,v的超定线性方程,通过最小二乘解:\begin{bmatrix} u\\ v \end{bmatrix}=-(A^TA)^{-1}A^Tb
  • 如此,就得到了像素在图像间的运动u,v。当t取离散时刻时,可以估计某块像素在若干个图像出现的位置。

3、实践:LK光流

OpenCV光流:

  • cv::calOpticalFlowPyrLK()

高斯牛顿法实现光流:

  • 光流也可以看成一个优化问题:通过最小化灰度误差估计最优的像素偏移。
  • 即求解:\mathop{min}\limits_{\Delta x,\Delta y}||I_1(x,y)-I_2(x+\Delta x,y+\Delta y)||_2^2
    • 雅可比为第二个图像在x+\Delta x,y+\Delta y处的梯度。
    • 在反向光流中,也可以用第一个图像的梯度I_1(x,y)来代替,且I_1(x,y)的梯度保持不变。

 多层光流:

  • 我们把光流写成优化问题,就必须假设优化的初始值靠近最优值,才能在一定程度上保障算法的收敛。如果相机运动过快,单层图像光流法容易达到一个局部极小值,这时引入图像金字塔来改善。
  • 图像金字塔是指对同一个图像进行缩放,得到不同分辨率的图像。计算光流时,先从顶层图像开始计算,然后把上一层的追踪结果作为下一层光流的初始值。该过程也成为由粗至精(Coarse-to-fine)的光流。
  • 由粗至精好处:当原始图像运动较大时,在顶层图像看运动仍然在一个很小的范围内。

光流法可以加速基于特征点的视觉里程计算方法,避免计算和匹配描述子的过程,但要求相机运动较平滑(或采集频率较高)

4、直接法

直接法的推导

目标是求第一个相机到第二个相机的相对位姿变换。

  • 完整的投影方程(Z1是P的深度,Z2是P在第二个相机坐标系下的深度):

        p_1=\begin{bmatrix} u\\ v\\ 1 \end{bmatrix}_1=\frac{1}{Z_1}KP

        p_2=\begin{bmatrix} u\\ v\\ 1 \end{bmatrix}_2=\frac{1}{Z_2}K(RP+t)=\frac{1}{Z_2}K(TP)_{1:3}

  • 直接法的思路是根据当前相机的位姿估计值寻找p2的位置。若相机的位姿不够好,p2和p1外观会有明显的差别。为了减小这一差别,需要优化相机位姿,来寻找与p1更相似的p2。此时最小化的不是重投影误差,而是光度误差,也就是P的两个像素的亮度误差:e=I_1(p_1)-I_2(p_2)
  • 上式e是标量,优化目标为该误差的二范式:\mathop{min}\limits_{T}J(T)=||e||_2^2
  • 灰度不变假设:假设一个空间点在各个视角下成像的灰度是不变的。N个空间点Pi,则整个相机位姿估计问题:\mathop{min}\limits_{T}J(T)=\sum_{i=1}^{N}e_i^Te_i,e_i=I_1(p_1,i)-I_2(p_2,i)
  • 这里优化变量是相机位姿T,而不像光流那样优化各个特征点的运动。为了求解该优化问题,我们关心误差e如何随着相机位姿T变化,需分析它们的导数关系。
    • e(T)=I_1(p_1)-I_2(u),其中q=TP,   u=\frac{1}{Z_2}Kq
    • 考虑李代数的左扰动模型,利用一阶泰勒展开:\frac{\partial e}{\partial T}=\frac{\partial I_2}{\partial u}\frac{\partial u}{\partial q}\frac{\partial q}{\partial \delta \xi }\delta \xi
      • \frac{\partial I_2}{\partial u} 为u处的像素梯度
      • \frac{\partial u}{\partial q}  为投影方程关于相机坐标系下的三维点的导数
      • \frac{\partial q}{\partial \delta \xi } 为变换后的三维点对变换的导数,\frac{\partial q}{\partial \delta \xi }=[I,-q^{\wedge}]
      • 后两项只与三维点q有关,与图像无关,经常合并一起:\frac{\partial u}{\partial \delta \xi },2×6矩阵
  •  推导出误差对于李代数的雅可比矩阵:J=\frac{\partial I_2}{\partial u}\frac{\partial u}{\partial \delta \xi }
  • 然后使用高斯牛顿或列文伯格-马夸尔特方法计算增量,迭代求解。

直接法的讨论

上述推导中,P是已知位置的空间的,它的获取方式:

  • RGB-D相机,可以将任意像素饭投影到三维空间,然后再投影到下一幅图像
  • 双目相机,根据视差计算像素深度
  • 单目相机,还需要考虑P的深度带来的不确定性。详细建13讲

这里只考虑简单的情况,依旧是P深度已知,根据P的来源,直接法分类:

  • 稀疏直接法:P来自于稀疏关键点。速度快,但只能计算稀疏的重构
  • 半稠密直接法:P来自部分像素。若像素梯度为0,则雅可比矩阵为0,不会对计算运动增量有任何贡献。因此,可以只考虑带有梯度的像素点,舍弃梯度不明显的地方。
  • 稠密直接法:P为全部像素。可以建立完整地图,但需要GPU加速。

 5、实践:直接法

根据视差图获取深度信息?

int disparity = disparity_img.at<uchar>(y, x);
double depth = fx * baseline / disparity;

直接法队特征点不敏感,代码中随机在第一张图像上选取点,不使用任何角点或特征点。

直接法迭代过程描述

  • 直接法完全依靠优化来求解相机位姿。如果想要得到正确的优化结果,必须保证大部分像素梯度能够把优化引导到正确的方向
  • 对于参考图像,测量到一个灰度值为299的像素。另外由于我们知道它的深度,可以推断出空间点P的位置。
  • 此外,我们得到一幅新图像,需要估计它的相机位姿。这个位姿是由一个初值不断优化迭代得到的。假设初值较差,在这个初值下,空间点P投影后的像素灰度值是126。于是此像素误差为229-126=103。为了减小这个误差,我们希望微调相机的位姿,使像素更亮一些
  • 怎样知道哪里像素更亮呢?就需要用到局部的像素梯度。为了提高亮度,建议优化算法微调相机,使P的像往梯度增加的方向移动。
  • 优化算法不能只听这个像素的一面之词,还需听取其他像素的建议。综合听取许多像素意见后,选择一个我们方向,计算出一个更新量exp(\xi ^\wedge)。加上更新量后,图像从I2移动到I2',这次更新后,误差变小了。理想情况下,期望误差不断下降,最后收敛。
  • 实际中,沿着图像梯度前进,很容易由于图像本身的非凸性(或噪声)落进一个局部极小值中,无法继续优化。只有当相机运动很小,图像中的梯度不会有很强的非凸性时,直接法才成立。

         

直接法优缺点

优点:

  • 可省去计算特征点、描述子的时间;
  • 只要求有像素梯度即可,不需要特征点
  • 可以构建半稠密乃至稠密的地图

缺点:

  • 非凸性。金字塔的引入可一定程度上减小非凸性的影响
  • 单个像素没有区分度。直接法通常建议选点500以上
  • 灰度不变是很强的假设。实用的直接法会同时估计相机的曝光参数。

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

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

相关文章

CefSharp音视频编译与免费下载

注&#xff1a;Cefharp 音频和视频播放编译&#xff0c;生成相应的dll文件&#xff0c;从而支持项目开发。 建议编译至少 16G 的 RAM和至少 250G 的 SSD。该脚本以 E 盘为例&#xff0c;您需要在 E 盘上手动创建 cef 文件夹。禁止在转载后通过发布其他平台向用户收取下载费用。…

TypeScript中Interface接口的深度探索与实践

定义接口 在TypeScript中&#xff0c;interface是一个强有力的概念&#xff0c;它用于定义类型签名&#xff0c;特别是对象的结构。接口可以用来描述对象应该有哪些属性、方法&#xff0c;以及这些成员的类型。它们是实现类型系统中“鸭子类型”&#xff08;duck typing&#…

vue3实现在新标签中打开指定的网址

有一个文件列表&#xff0c;如下图&#xff1a; 我希望点击查看按钮的时候&#xff0c;能够在新的标签页面打开这个文件的地址进行预览&#xff0c;该如何实现呢&#xff1f; 比如&#xff1a; 实际上要实现这个并不难&#xff0c;参考demo如下&#xff1a; 首先&#x…

网络安全等级保护解决方案的主打产品

网络安全等级保护解决方案的主打产品&#xff1a; HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…

浅谈C语言整型类数据在内存中的存储

1、整型类数据 C语言中的整型类数据都归类在整型家族中&#xff0c;其中包括&#xff1a;char、short、int、long、long long这5个大类&#xff0c;而每个大类中又分为两类signed和unsigned,这些都是C语言中的内置类型。以下重点基于char和int这两种类型的数据进行阐述&#x…

dsa加训

refs: OI Wiki - OI Wiki (oi-wiki.org) 1. 枚举 POJ 2811 熄灯问题 refs : OpenJudge - 2811:熄灯问题 如果要枚举每个灯开或者不开的情况&#xff0c;总计2^30种情况&#xff0c;显然T。 不过我们可以发现&#xff1a;若第i行的某个灯亮了&#xff0c;那么有且仅有第i行和第…

springcloud接入skywalking作为应用监控

下载安装包 需要下载SkyWalking APM 和 Java Agent 链接: skywalking 安装 下载JDK17&#xff08;可不配置环境变量&#xff09; 目前skywalking 9.0及以上版本基本都不支持JDK8&#xff0c;需要JDK11-21&#xff0c;具体版本要求在官网查看。 我这里使用的是skywalking9.…

德国云手机:企业移动办公解决方案

在现代商业环境中&#xff0c;移动办公已经成为一种趋势。德国云手机作为一种高效的解决方案&#xff0c;为企业提供了强大的支持。本文将探讨德国云手机如何优化企业的移动办公环境。 一、德国云手机的主要优势 高灵活性 德国云手机具有高度的灵活性&#xff0c;能够根据用户需…

链式法则和自动求导

向量链式法则 说明&#xff1a; 1.第一个式子&#xff0c; y是标量&#xff0c;u是标量&#xff0c;x是n维向量 2.第二个式子&#xff0c;y是标量&#xff0c;u是k维向量&#xff0c;x是n维向量&#xff0c;所以y对u求导是k维的行向量&#xff0c;u对x求导是k行n列的矩阵&…

Spark实时(三):Structured Streaming入门案例

文章目录 Structured Streaming入门案例 一、Scala代码如下 二、Java 代码如下 三、以上代码注意点如下 Structured Streaming入门案例 我们使用Structured Streaming来监控socket数据统计WordCount。这里我们使用Spark版本为3.4.3版本&#xff0c;首先在Maven pom文件中导…

Android中Service学习记录

目录 一 概述二 生命周期2.1 启动服务startService()2.2 绑定服务bindService()2.3 先启动后绑定2.4 先绑定后启动 三 使用3.1 本地服务&#xff08;启动式&#xff09;3.2 可通信的服务&#xff08;绑定式&#xff09;3.3 前台服务3.4 IntentService 总结参考 一 概述 Servic…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十章 Linux设备树

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

Springboot 开发之 RestTemplate 简介

一、什么是RestTemplate RestTemplate 是Spring框架提供的一个用于应用中调用REST服务的类。它简化了与HTTP服务的通信&#xff0c;统一了RESTFul的标准&#xff0c;并封装了HTTP连接&#xff0c;我们只需要传入URL及其返回值类型即可。RestTemplate的设计原则与许多其他Sprin…

spring boot(学习笔记第十四课)

spring boot(学习笔记第十四课) Spring Security的密码加密&#xff0c;基于数据库认证 学习内容&#xff1a; Spring Security的密码加密基于数据库认证 1. Spring Security的密码加密 如果用户的密码保存在数据库中是以明文保存&#xff0c;对于公司的安全将是灾难性的&…

【PyTorch】图像多分类项目部署

【PyTorch】图像多分类项目 【PyTorch】图像多分类项目部署 如果需要在独立于训练脚本的新脚本中部署模型&#xff0c;这种情况模型和权重在内存中不存在&#xff0c;因此需要构造一个模型类的对象&#xff0c;然后将存储的权重加载到模型中。 加载模型参数&#xff0c;验证模型…

NFTScan 浏览器现已支持 .mint 域名搜索功能!

近日&#xff0c;NFT 数据基础设施 NFTScan 浏览器现已支持用户输入 .mint 域名进行 Mint Blockchain 网络钱包地址的搜索查询&#xff0c; NFTScan 用户能够轻松地使用域名追踪 NFT 交易&#xff0c;为 NFT 钱包地址相关的搜索查询功能增加透明度和便利性。 NFTScan explorer…

goenv丝滑控制多版本go

安装 先装下goenv brew install goenv去 ~/.bash_profile 添加一下 export GOENV_ROOT"$HOME/.goenv" export PATH"$GOENV_ROOT/bin:$PATH" eval "$(goenv init -)"执行一下让配置生效 source ~/.bash_profile插一嘴&#xff0c;如果之前是在…

VScode 批量操作

VScode 批量操作 批量修改 按住 alt/option 键&#xff0c; 选择需要批量操作的位置 如果是多行&#xff0c;则按住 altshift 键 可以直接操作 但是有时候比如变量命名&#xff0c;可能需要递增操作的命名 需要下载插件 Increment Selection 按照1的方法多选光标之后&am…

Java | 自制AWT单词猜一猜小游戏(测试版)

目录 游戏标题 开发过程 开发想法 技术栈 代码呈现 导包 核心代码 游戏标题 探索知识的迷宫&#xff0c;体验自制AWT单词猜一猜小游戏 在数字时代&#xff0c;学习可以是多彩的&#xff0c;游戏可以是智慧的。我们自豪地推出“单词猜猜猜”是一款结合了教育与娱乐的自制…

MQTTX连接华为云IoTDA

目录 华为IoTDA平台 MQTTX连接参数的设置 物模型的构建 属性上报 基本数据格式 时戳 我以前上课都是用巴法云服务器来演示MQTT的&#xff0c;前几天因为测试工业互联网关使用了华为的IoTDA&#xff0c;觉得也不算太复杂&#xff0c;今天尝试用MQTTX连接华为云&#xff0c…