通俗易懂!视觉slam第九部分——光流(Optical Flow)

光流是一种描述像素随着时间,在图像之间运动的方法,如图所示。随着时间的经过,同一个像素会在图像中运动,而我们希望追踪它的运动过程。计算部分像素运动的称为稀疏光流,计算所有像素的称为稠密光流。稀疏光流以 Lucas-Kanade 光流为代表,并可以在 SLAM 中用于跟踪特征点位置。主要介绍 Lucas-Kanade 光流,亦称 LK光流。 

Lucas-Kanade 光流 

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

这种方式把图像看成了关于位置与时间的函数,它的值域就是图像中像素的灰度。现在考虑某个固定的空间点,它在 t 时刻的像素坐标为 x,y。由于相机的运动,它的图像坐标将发生变化。我们希望估计这个空间点在其他时刻里图像的位置。怎么估计呢?这里要引入光流法的基本假设:
灰度不变假设:同一个空间点的像素灰度值,在各个图像中是固定不变的。

对于 t 时刻位于 (x,y) 处的像素,我们设 t + dt 时刻,它运动到 (x + dx,y + dy) 处。由于灰度不变,我们有:

灰度不变假设是一个很强的假设,实际当中很可能不成立。事实上,由于物体的材质不同,像素会出现高光和阴影部分;有时,相机会自动调整曝光参数,使得图像整体变亮或变暗。这些时候灰度不变假设都是不成立的,因此光流的结果也不一定可靠。然而,从另一方面来说,所有算法都是在一定假设下工作的。如果我们什么假设都不做,就没法设计实用的算法。所以,暂且让我们认为该假设成立,看看如何计算像素的运动。对左边进行泰勒展开,保留一阶项,得: 

因为我们假设了灰度不变,于是下一个时刻的灰度等于之前的灰度,从而

两边除以 dt,得:

其中 dx/dt 为像素在 x 轴上运动速度,而 dy/dt 为 y 轴速度,把它们记为 u,v。同时 ∂I/∂x 为图像在该点处 x 方向的梯度,另一项则是在 y 方向的梯度,记为I_{x},I_{y} 。把图像灰度对时间的变化量记为I_{t},写成矩阵形式,有:

我们想计算的是像素的运动 u,v,但是该式是带有两个变量的一次方程,仅凭它无法计算出 u,v。因此,必须引入额外的约束来计算 u,v。在 LK 光流中,我们假设某一个窗口内的像素具有相同的运动。 

考虑一个大小为 w ×w 大小的窗口,它含有数量的像素。由于该窗口内像素具有同样的运动,因此我们共有个方程:

记:

于是整个方程为:

这是一个关于 u,v 的超定线性方程,传统解法是求最小二乘解。最小二乘在很多时候都用到过: 

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

发布了368 篇原创文章 · 获赞 188 · 访问量 51万+

猜你喜欢

转载自blog.csdn.net/qq_32146369/article/details/104427515
今日推荐