视觉SLAM笔记(41) 光流

视觉SLAM笔记(41) 光流


1. 光流

直接法是从光流演变而来的
它们非常相似,具有相同的假设条件

光流描述了像素在图像中的运动
而直接法则附带着一个相机运动模型

为了说明直接法,先来介绍一下光流
光流是一种描述像素随着时间,在图像之间运动的方法
在这里插入图片描述
随着时间的经过,同一个像素会在图像中运动,而希望追踪它的运动过程
计算部分像素运动的称为 稀疏光流,计算所有像素的称为 稠密光流

稀疏光流以 Lucas-Kanade 光流为代表,并可以在 SLAM 中用于跟踪特征点位置
因此,主要介绍 Lucas-Kanade 光流,亦称 LK光流


2. LK光流

在 LK 光流中,认为来自相机的图像是随时间变化的
图像可以看作时间的函数: I ( t ) I(t)
那么,一个在 t t 时刻,位于 ( x , y ) (x, y) 处的像素
它的灰度可以写成: I ( x , y , t ) I(x, y, t)

这种方式把图像看成了关于位置与时间的函数,它的值域就是图像中像素的灰度
现在考虑某个固定的空间点,它在 t t 时刻的像素坐标为 x , y x, y
由于相机的运动,它的图像坐标将发生变化
希望估计这个空间点在其他时刻里图像的位置

因此,这里要引入光流法的基本假设:
灰度不变假设:同一个空间点的像素灰度值,在各个图像中是固定不变的。
对于 t t 时刻位于 ( x , y ) (x, y) 处的像素,我们设 t + d t t + dt 时刻,它运动到 ( x + d x , y + d y ) (x + dx, y + dy)
由于灰度不变,有:
在这里插入图片描述
灰度不变假设是一个很强的假设,实际当中很可能不成立
事实上,由于物体的材质不同,像素会出现高光和阴影部分
有时,相机会自动调整曝光参数,使得图像整体变亮或变暗
这些时候灰度不变假设都是不成立的,因此光流的结果也不一定可靠

然而,从另一方面来说,所有算法都是在一定假设下工作的
如果什么假设都不做,就没法设计实用的算法
所以,暂且认为该假设成立,看看如何计算像素的运动
对左边进行泰勒展开,保留一阶项,得:
在这里插入图片描述
因为假设了灰度不变,于是下一个时刻的灰度等于之前的灰度,从而:

在这里插入图片描述
两边除以 d t dt ,得:
在这里插入图片描述
其中 d x / d t dx/dt 为像素在 x x 轴上运动速度,而 d y / d t dy/dt y y 轴速度,把它们记为 u u , v v
同时 \partial I I / \partial x x 为图像在该点处 x 方向的梯度,另一项则是在 y 方向的梯度,记为 I x Ix , I y Iy
把图像灰度对时间的变化量记为 I t It ,写成矩阵形式,有:

在这里插入图片描述
想计算的是像素的运动 运动方程 u u , 观测方程 v v
但是该式是带有两个变量的一次方程,仅凭它无法计算出 u u , v v
因此,必须引入额外的约束来计算 u u , v v

在 LK 光流中,假设 某一个窗口内的像素具有相同的运动
考虑一个大小为 w × w 大小的窗口,它含有 w2 数量的像素
由于该窗口内像素具有同样的运动,因此共有 w2 个方程:
在这里插入图片描述
记:
在这里插入图片描述
于是整个方程为:
在这里插入图片描述
这是一个关于 u u , v v 的超定线性方程,传统解法是求最小二乘解
最小二乘在很多时候都用到过:
在这里插入图片描述
这样就得到了像素在图像间的运动速度 u u , v v

t t 取离散的时刻而不是连续时间时,可以估计某块像素在若干个图像中出现的位置
由于像素梯度仅在局部有效,所以如果一次迭代不够好的话,我们会多迭代几次这个方程
在 SLAM 中, LK 光流常被用来跟踪角点的运动


参考:

《视觉SLAM十四讲》


相关推荐:

视觉SLAM笔记(40) 特征点的缺陷
视觉SLAM笔记(39) 求解 ICP
视觉SLAM笔记(38) 3D-3D: ICP
视觉SLAM笔记(37) 求解 PnP
视觉SLAM笔记(36) 3D-2D: PnP


发布了217 篇原创文章 · 获赞 290 · 访问量 288万+

猜你喜欢

转载自blog.csdn.net/qq_32618327/article/details/102690698