光流是由观察者和场景之间的[相对运动]引起的视觉场景中物体、表面和边缘的运动模式。一般而言,光流是由于场景中前景目标本身的移动、观测者运动,或者两者的共同运动所产生的。

光流在很多领域中都被用到,例如视频中的运动目标检测,视频压缩等等。
在分析光流时,需要用到两个重要假设:1.对象的像素强度在连续帧之间不会改变。2.相邻像素具有相似的运动。下面我们运用这两个假设来推导光流公式。
光流法实际是通过检测图像像素点的强度随时间的变化进而推断出物体移动速度及方向的方法。假设该移动很小,假设该移动很小,那么可以根据泰勒级数得出:
根据假设1,由于移动很小,此时这时对象位移不会改变对象的像素强度:
进一步得出:
最终得出光流公式:
这里的,
是x, y方向上的速率,或称为I(x, y, t)的光流。而
,
,
则是图像(x, y, t)在对应方向上的偏导数。可以看到光流公式中有两个未知量
,
, 无法直接求解。因此我们需要更多的外部条件来求解方程。
Lucas-Kanade 方法
求解光流方程有很多方法,其中最著名的便是 Lucas-Kanade方法。它应用了之前提到的第二个假设,即所有相邻像素都将具有相似的运动。对于每一个像素,Lucas-Kanade 方法选取与它相邻的8个像素进行分析。根据假设,所有 9 个像素都有相同的运动。所以现在我们的问题求解 只有2个未知变量的9个方程组。
......
这样的方程组没有唯一解,这里我们使用最最小二乘拟合方法获得一个最优近似解。
Lucas-Kanade方法的局限性
由于上述假设和分析都是针对较小的运动,光流算法会受到突然移动的影响。如果两帧图像之间的运动太大,光流法可能会失效。对于这个问题我们可以通过图像金字塔来解决,当我们使用更高层的金字塔图像时,小的运动被去除,大的运动变成小运动。然后再应用 Lucas-Kanade,就可以得到正确的光流。
OpenCV 光流演示:https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html