浅谈光流跟踪之KLT稀疏光流跟踪算法

news2024/12/23 18:18:13

0 简介

在学习vins-mono过程中,算法前端采用基于KLT光流的跟踪方法,对光流和KLT光流进行简单的总结。包括LK光流跟踪算法原理,基于金字塔改进的LK光流跟踪,KLT光流跟踪算法,以及在光流跟踪时使用的角点检测算法Harris角点检测和Shi-Tomasi角点检测。

光流跟踪分为稠密光流和稀疏光流,稠密光流即对图像中所有的像素点进行跟踪,稀疏光流则是对图像中的特征点进行跟踪。KLT光流跟踪是一种稀疏光流跟踪算法。

1 光流的三大假设条件

光流法跟踪的的主要原理就是通过计算像素点在相邻帧图像之间的速度,可以得到像素在下一帧的位置,具体计算方法则是根据光流法的三大假设联立方程组,基于最小二乘对像素在两帧之间的运动进行求解。

在vins系列中,算法前端采用KLT光流跟踪算法,函数入口为calcOpticalFlowPyrLK

光流跟踪法的三大假设条件如下所示:

  • 亮度恒定即灰度不变性:同一个空间点的像素灰度值,在各个图像中是固定不变的
  • 小运动即时间连续性:相邻帧间保持微小的运动,时间的变化不会引起像素的剧烈变化
  • 空间一致性:特征点及其周围邻域的像素均具有相同的运动

2 LK光流跟踪算法原理

(此处参考14讲第8章)
对于t时刻的某个像素(x,y),当相机运动到t+1时刻时,基于灰度不变性假设可以得到如下关系
在这里插入图片描述

对公式左边进行一阶泰勒展开,并根据灰度不变性可以得到以下公式:
在这里插入图片描述

在这里插入图片描述

首先dx/dtdy/dt分别为像素点在x轴和y轴方向上的导数,分别记为u和v;
然后∂I/∂x∂I/∂y分别为像素值在(x,y)处的偏导数,记为在(x,y)处的梯度;
则可以将上述公式写成矩阵的形式:
在这里插入图片描述

为了求解像素在相邻两帧的速度(u,v),根据空间一致性假设同一像素块中的像素具有相同的运动,则可以在特征点像素周围选择一个邻域范围,该范围内的像素和特征点具有相同的运动,则可以联立方程组然后根据最小二乘法对变量(u,v)进行求解。
在这里插入图片描述

3 LK-金字塔光流

这部分的参考链接:https://blog.csdn.net/App_12062011/article/details/51880258
当相机运动速度过快时,相邻帧图像之间就会出现较大的位移,这时小运动这一较强的假设就不再成立,由于同一特征点在相邻图像中的位移Δ_pixel较大,在进行迭代求解时很容易陷入局部最优的情况。

金字塔光流则是根据这一问题提出的改进措施。
通过对图像进行resize,在进行跟踪时首先在分辨率较小的金字塔图像之间进行跟踪。因为对图像进行了下采样,如果说在原图像中像素点在800x800的图像上的运动速度为[8,8],那么在400x400的图像上的运动速度可能会接近[4x4],在200x200的图像上速度接近[2x2],此时在分辨率为200x200又可以使用LK光流进行求解。在求解得到像素在金字塔顶层图像的速度后,会将该速度和在像素点处的梯度信息作为初值继续计算特征点在下一层的速度和梯度信息,直到求解出特征点在原图像的速度信息。

现在假设某一特征点,分别在图像I和I时刻的坐标为x_I(x,y)、x_J(x+dx,y+dy)dx=(dx,dy)即为图像在x处的速度。实际上,I时刻的图像到J时刻的图像之间经历的一个仿射变换,因此对于光流跟踪问题可以转化为一个求解一个速度dx=[dx,dy]和一个仿射变换矩阵A,使得特征点邻域内的像素灰度值之差最小,仿射变换矩阵的定义如下:
在这里插入图片描述

3.1 金字塔创建

一般金字塔为4层,这里涉及到一个精度和实时性之间的权衡,金字塔层数越高则需要进行光流计算的次数越多,实时性越差。

3.2 金字塔跟踪

这部分的参考链接:https://blog.csdn.net/App_12062011/article/details/51880258

  • 建立金字塔后,首先对于最高层的图像计算出其上的光流;
  • 通过上一层的计算结果对下一层的的图像进预平移,并在L层的基础上计算出该层的残余光流向量dL,简单来说下一层像素点的位置=初始图像下一层的位置+上一层光流+上一层与下一层之间的位置差值
  • 对于每一层迭代光流计算,最终得到的光流也即是所有层光流的叠加。

4 KLT光流跟踪

LK光流法旨在说明对图像像素的一种光流跟踪算法,根据三大假设联立方程组最终将问题转换为求解最小二乘的问题,即AX=b的形式。由于Hessian矩阵的特征值都比较大时才能满足空间一致性的假设条件,即在选择角点作为关键点时符合这一情况。

实际上,一方面像素移动并不会那么简单,另一方面窗口内像素并不都是同样的移动方式,因为这样的近似必然会带来误差。而现在的问题就是如何去选择合适的窗口,或者特征点,从而获得最为精确的跟踪。KLT角点检测方法就是为了选择一个适合跟踪的特征点,它认为一个好的特征点的定义应当就是能被好的跟踪。

在opencv中集成的goodFeaturesToTrack函数即使用的Shi-Tomasi角点检测。

5 Harris角点检测

参考链接:https://zhuanlan.zhihu.com/p/150411153

算法的核心是利用局部窗口在图像上进行移动,判断灰度是否发生较大的变化。如果窗口内的灰度值(在梯度图上)都有较大的变化,那么这个窗口所在区域就存在角点。

1.Harris角点检测步骤:

  • 当窗口(局部区域)同时向 x (水平)和 y(垂直) 两个方向移动时,计算窗口内部的像素值变化量 E(x,y) ;
  • 对于每个窗口,都计算其对应的一个角点响应函数 R;
  • 然后对该函数进行阈值处理,如果 R>threshold,表示该窗口对应一个角点特征。

2.Harris角点数学模型
建立数学模型的目的,是为了确定哪些窗口会引起较大的灰度值变化。对于窗口中某个点(x,y)其灰度值为I(x,y),当其移动一个(u,v)的距离后,其对应灰度值为I(x+u,y+v),I(x+u,y+v) - I(x,y)即为窗口在移动是该像素灰度值的变化。

为了更为清晰的确定窗口内的像素灰度变化,选择计算窗口内所有像素灰度值的变化。如果窗口中心点像素是角点,那么窗口移动前后,中心点的灰度值变化非常强烈,所以该点权重系数应该设大一点,表示该点对灰度变化的贡献较大;而离窗口中心(角点)较远的点,这些点的灰度变化比较小,于是将权重系数设小一点,表示该点对灰度变化的贡献较小。

因此这里引入窗口函数w(x,y)(其实就是一个高斯核),以计算整个窗口中像素灰度值得变化。设窗口在移动前后的灰度值变化为E(u,v),则当窗口中心像素为角点时,E(u,v)会变得比较大。
在这里插入图片描述

为简化计算,将I(x+u,y+v)进行一阶泰勒展开。
在这里插入图片描述

其中对应的矩阵M为:
在这里插入图片描述

3.Harris角点求解
现在定义了Harris角点的数学模型,下一步就是如何去寻找角点的坐标以及存在角点的对应的窗口。

(1)通过M矩阵的特征值判断
如果特征值在两个方向都比较大就是角点;如果特征值在一个方向比较大是边;如果特征值都很小就是平面。
在这里插入图片描述

可以把R看成旋转因子,其不影响两个正交方向的变化分量。经对角化处理后,将两个正交方向的变化分量提取出来,就是 λ1 和 λ2(特征值)。
在这里插入图片描述

(2)通过R响应判断
本质上也是根据M矩阵的特征值计算一个分数R,根据分数进行判断:R大于某个阈值,认为是角点;R大于0但小于阈值是图像块;R小于0是边缘。
R的计算方式如下:
在这里插入图片描述

Harris 角点检测的结果是带有这些分数R的灰度图像,设定一个阈值,分数大于这个阈值的像素就对应角点。

6 Shi-Tomasi角点检测

参考链接:https://blog.csdn.net/qq_40374812/article/details/117016214
Shi-Tomasi角点是Harris角点的改进版。

Harris角点检测算法引入角点响应值R,根据R值的大小来判断是否存在角点和边界。
在这里插入图片描述

Shi-Tomasi角点检测算法就是针对R值的计算公式进行了优化和修改。由于 Harris角点检测算法的稳定性和α值有关,而α是个经验值,需要我们根据自身经验去设置,不好设定最佳值。

Shi-Tomasi发现,角点的稳定性其实和矩阵M的较小特征值有关(即λ1,λ2),于是直接用较小的那个特征值作为分数。这样就不用调整α值了。

所以 Shi-Tomasi 将R值的计算公式改为如下形式:R = min(λ1,λ2)

和 Harris 一样,如果该分数大于设定的阈值,我们就认为它是一个角点。
在这里插入图片描述

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

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

相关文章

追梦之旅【数据结构篇】——详解C语言实现链队列

详解C语言实现链队列~😎前言🙌整体实现内容分析💞预备小知识🙌1.链队列头文件编写🙌2.链队列功能文件(Queue.c )编写:🙌1)初始化函数实现2)销毁函…

【一些回忆】2022.02.26-2023.02.26 一个普通男孩的365天

💃🏼 本人简介:男 👶🏼 年龄:18 🤞 作者:那就叫我亮亮叭 📕 专栏:一些回忆 为什么选择在这个时间节点回忆一下呢? 一是因为今天距离2023高考仅剩1…

华为OD机试题,用 Java 解【删除字符串中出现次数最少的字符】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

Linux内核内存相关问题,这一篇让你彻底了解

linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux 内核几种内存管理的方法,内存使用…

排错工具ping和trace(电子科技大学TCP/IP实验四)

一.实验目的 1、了解网络连通性测试的方法和工作原理 2、了解网络路径跟踪的方法和工作原理 3、掌握 MTU 的概念和 IP 分片操作 4、掌握 IP 分组生存时间(TTL)的含义和作用 5、掌握路由表的作用和路由查找算法 二.预备知识 …

[SQL Statements] 基本的SQL知识 之DDL针对数据库的基本操作

SQL Statements SQL语句的学习 之 DDL针对数据库的基本操作 什么是database 在 MySQL 中,Database(数据库)是一组有组织的数据集合,可以存储和管理相关数据的容器。一个数据库可以包含多个表(Table)&…

如何用 chatGPT,给大家来一个自我介绍

大家好,我是不吃西红柿的无线机械键盘,我的名字叫 Keychron K3 Pro。今天,我通过西红柿主人的手,使用 chatGPT 来介绍一下我自己。我的与众不同 我是由精密机械元件制作而成,并采用抗键渗设计,以提供更快、…

电子科技大学网络协议(TCP/IP作业答案)--网工(五次作业汇总)

目录 作业1:OSI/RM、TCP/IP编址和底层网络技术 作业2:IP地址规划与路由选择 作业3:ARP、IP、ICMP 作业4:UDP、Routing Protocol 作业五 作业1:OSI/RM、TCP/IP编址和底层网络技术 物理地址属于OSI/RM的哪一层&…

关于Linux内存管理的详细介绍,这篇万字长文值得你的收藏点赞

Linux内存管理一、Linux内存管理概述1.1 什么是内存管理1.2 内存管理的重要性1.3 内存管理的组成部分二、物理内存管理2.1 什么是物理内存2.2 物理内存管理方式2.2.1 连续内存管理2.2.2 非连续内存管理2.3 物理内存管理相关的函数及示例三、虚拟内存管理3.1 什么是虚拟内存3.2 …

HTML常用基础内容总结

文章目录一、对HTML的感性认知前置知识什么是web前端,什么是web后端前端技术栈、后端技术栈开发与运行的区别浏览器的功能是什么简介写一个简单可运行的的html代码前端开发方式二、VSCode的简单使用三、常用的HTML标签最最基本的HTML结构HTML代码特点注释标签标题标…

「JVM 高效并发」Java 内存模型

Amdahl 定律代替摩尔定律成为了计算机性能发展的新源动力,也是人类压榨计算机运算能力的最有力武器; 摩尔定律,描述处理器晶体管数量与运行效率之间的发展关系;Amdahl 定律,描述系统并行化与串行化的比重与系统运算加…

这9道软件测试面试题,就能刷掉90%的软件测试员

转眼就要到“金三银四”了,没点真本事真技术,没点面试经验,不了解点职场套路,如何过五关斩六将?如何打败面试官?如何拿下那梦寐以求的offer? 如果你的跳槽意向已经很确定,那么请往下…

【python量化】大幅提升预测性能,将NSTransformer用于股价预测

写在前面NSTransformer模型来自NIPS 2022的一篇paper《Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting》。NSTransformer的目的主要是为了解决其他方法出现过平稳化处理的问题。其通过提出序列平稳化以及去平稳化注意力机制可以使得模型…

我眼中的柔宇科技

关注、星标公众号,直达精彩内容来源:技术让梦想更伟大作者:李肖遥很早就知道了柔宇科技,当时是因为知道创始人刘自鸿,23岁清华本硕毕业,26岁获斯坦福大学电子工程博士学位,历时不超过3年&#x…

你真的了解环形队列吗?(学习数据结构必须掌握的模型)

目录 0.前言 1. 什么是环形队列 2. 如何使用数组结构 / 链表结构 对环形队列封装 3. 代码手撕环形队列各个接口 3.1 代表封装一个环形队列 3.2 环形队列的初始化 3.3 环形队列的插入 3.4环形队列的删除 3.5环形队列的判空 3.6环形队列的判满 3.7环形队列的队头 3.8环…

NCNN量化详解2

1 NCNN量化算法简介 量化算法介绍的文章的话,下面这篇文章的大佬 @章小龙 介绍的比我好多啦。虽然介绍的是NVIDIA TensorRT的算法,但是NCNN是参考其算法做出来的,方法几乎一样 首先NVIDIA有一个PPT,很好的阐述了他们的方案,推荐大家也去看一下: https://link.zhihu.com…

我来了,RK第七届开发者大会

大家好,我是发哥的朋友windsnake「也是发哥文章里面经常出现的邓总」。今年终于是有时间参加了一次Rk的开发者大会,这篇文章记录下自己的所见所闻,算是对自己福州之行的一次总结。从深圳出发月亮还没睡醒的早上,坐5号线杀到深圳北…

【项目设计】高并发内存池(二)[高并发内存池整体框架设计|threadcache]

🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…

【无标题String、StringBuffer、StringBuilder区别】

一、背景。 这篇文章主要介绍了String、StringBuffer、StringBuilder的区别详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。放假在家里休息,闲来无事,想…

华为OD机试题,用 Java 解【汽水瓶】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…