一、简介1
1.1 什么的光流
光流(optical flow)是空间运动物体在观察成像平面上的像素运动的瞬时速度。
光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。
通常将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量。
1.2 光流的物理意义
一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。
当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。
图(1)展示的便是三维空间内物体的运动在二维成像平面上的投影。得到的是一个描述位置变化的二维矢量,但在运动间隔极小的情况下,我们通常将其视为一个描述该点瞬时速度的二维矢量u=(u,v),称为光流矢量。

图1
二、梯度光流法
使用这个方法必须有三个重要的假设:
- 两帧图片之间的远动不大(高速摄像机)。
- 在一个窗口$w(x,y)$内,梯度保持不变。
- 图片的光照不变。
2.1 公式推导
假设$I(x,y,t)$为一图像在t时刻的$x,y$位置的像素值,那么其在下一刻的像素值等于:
在使用梯度进行光流计算的算法里面,右式可以分解为:(高次位舍去)
其中$I_x$为$I(x,y,t)$的x方向上的梯度,$I_y$同理,$I_t$表示两幅图片在$x,y$位置的差值。由于左右像素值大小相等,则意味着:
两边同时除$dt$得到约束方程:
其中$u,v$表示移动方向。约束方程左边的物理意义为:在同一副图片中根据$x,y$点的像素值和梯度信息在$x+u,y+v$位置的像素值,但是时间t之后,这里的像素值却不变。所以只需要经过$u,v$移动后使变化的像素值等于$I_t$即可。但是可以看到仅仅一点的$I_x,I_y,I_t$信息是无法计算出两个变量的。所以我们使用一个窗函数计算这个窗内的所有点之间的差值,这样我们就会得到一个超定方程组。根据超定方程组的结果:
其中p为:
A为:
B为:
三、实际操作
- python 3.7
- numpy
- opencv2
参考文献
1. 计算机视觉—光流法(optical flow)简介 ↩