1、KLT光流
《1》、光流指运动物体在像素平面上的瞬时速度,它利用图像序列中像素在时间域上的变化以及相邻帧之间的关系来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。
《2》、KLT光流假设
1、相邻帧之间的亮度恒定;
2、相邻视频帧的取帧时间连续,或者相邻帧之间物体的运动比较“微小”;
3、保持空间一致性,既是领域像素有相似运动,保持相邻;
假设1保证目标不受亮度的影响
假设2保证在目标领域内能够找到对应的特征点;
假设3保证在同一个窗口内,所有点的位移相同;
klt在满足上面3个条件时工作较好,能用但其实跟踪不会太准,有很多改进方法,比较实用的有 TLD 算法。
2、KLT计算原理
来自维基的简洁KLT计算
维基公式截图主要是为了好理解demo编码才加上的,实际和论文推导是一个意思。
demo中实际求解公式1向量(Vx,Vy)使用牛顿迭代法。demo使用牛顿法迭代一定次数后就认为得到了近似解。
3、klt demo的算法流程
《1》、计算Shi_Tomas角点;
计算X,Y方向梯度幅值gradxx和gradyy,及X,Y方向梯度乘积gradxy;
求取坐标点(x,y)处的2x2梯度幅值组成矩阵[gradxx gradxy 的最小特征值
gradxy gradyy]
特征值与阈值比较,若大于阈值则认为该点为强角点;
《2》、跟踪
do
{
w*h领域内计算两帧图像之间的像素差diff;
w*h领域内计算两帧图像点(x,y)处,X,Y方向的梯度和;
w*h领域内计算梯度幅值gradxx, gradyy及gradxy;
w*h领域内分别计算x,y方向diff与对应方向的梯度乘积之和;
求解速度Vx,Vy;
根据速度更新跟踪坐标点;
} while(牛顿迭代法退出条件)
说明:
a、shi_tomas角点与Harris角点差异主要是响应函数不同如下:来源
4、添加注释理解版 demo
效果:
画光流跟踪线(图中白色的线)不是很严谨,有些跟踪看上去就有点飘。有些非运动物体(窗户等)的角点一直存在,可以通过一些手段去掉,如高斯背景建模。速度挺慢的,demo不少地方都可以进行优化,但是暂时先不做了。
5、参考及看demo时会用到的一些链接
KLT光流:
http://cecas.clemson.edu/~stb/klt/previous_versions.html
http://cecas.clemson.edu/~stb/klt/birchfield-klt-derivation.pdf
http://cseweb.ucsd.edu/classes/sp02/cse252/lucaskanade81.pdf
https://blog.csdn.net/irobot_davinci/article/details/29635199
https://zh.wikipedia.org/wiki/卢卡斯-卡纳德方法
Tomas角点检测:https://blog.csdn.net/tuwenqi2013/article/details/83041318
双线性差值:http://www.cnblogs.com/xpvincent/archive/2013/03/15/2961448.html