0. 写在前面
因为项目上需要判断画面是朝着哪个方向在运动,故开始研究光流算法,恰巧Opencv上有这个模块,故了解一下原理,再实战。
参考文章:OpenCV3学习(11.2)LK光流法原理及opencv实现_calcopticalflowpyrlk原理-CSDN博客
1. 光流的概念(Optical flow)
光流是一种运动模式,指的是一个物体、表面、边缘在一个视角下由一个观察者(比如眼睛、摄像头等)和背景之间形成的明显移动。光流技术,如运动检测和图像分割,时间碰撞,运动补偿编码,三维立体视差,都是利用了这种边缘或表面运动的技术。
光流用大白话来说,就是在一个移动的序列的图像帧中,图像上每一个像素的x,y位移量,比如第t帧的时候A点的位置是(x1,y1),那么我们在第t+1帧的时候再找到A点,假设此时的坐标为(x2,y2),就可以确定运动公式:(u,v)= (x2,y2) - (x1,y1)。
2. 光流算法
2.1 两个光学特性假设前提
- 运动物体的灰度在很短的间隔时间内保持不变;
- 给定领域内的速度向量变化是缓慢的。
2.2 光流约束方程
以上就是基本的光流约束方程,约束只有一个,方程解不出来,LK光流算法考虑到像素的领域,将问题转变为计算某些点集的光流,通过联立多个方程,从而让方程有解。
2.3 LK光流算法
在计算机视觉领域,Lucas-Kanade光流算法是一种两帧差分的光流估计算法。当下比较流行和常见的,计算两帧在时间t到t+△t之间每个像素点位置的移动,原理是基于图像信号的泰勒级数,差分的方式,对空间和时间坐标使用偏导数。
三个假设:
- 亮度恒定,图像场景中的目标像素在帧间运动时外观上保持不变;
- 时间连续或者运动很缓慢,时间变化相对图像中的运动比例要足够小;
- 领域内光流一致,一个场景中的同一表面的局部领域内具有相似的运动。
使用金字塔缩放,考虑物体的运动速度较大时,算法会出现较大的误差,那么缩小图像尺寸,减少图像中物体的运动速度。
3. 写在最后
光流算法的理论已经是10年前的了,opencv4之前都是老版本,更新了一版DIS,下一篇直接上实战。