光流法与KLT

一 光流

光流的概念是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。其计算方法可以分为三类:

(1)基于区域或者基于特征的匹配方法;

(2)基于频域的方法;

(3)基于梯度的方法;

简单来说,光流是空间运动物体在观测成像平面上的像素运动的“瞬时速度”。光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的“运动”。研究光流场的目的就是为了从图片序列中近似得到不能直接得到的运动场。

 光流法的前提假设:

(1)相邻帧之间的亮度恒定;

(2)相邻视频帧的取帧时间连续,或者,相邻帧之间物体的运动比较“微小”;

(3)保持空间一致性;即,同一子图像的像素点具有相同的运动

这里有两个概念需要解释:

运动场,其实就是物体在三维真实世界中的运动;

光流场,是运动场在二维图像平面上的投影。




如上图所示,H中的像素点(x,y)I中的移动到了(x+u,y+v)的位置,偏移量为(u,v)

光流法用于目标检测的原理:给图像中的每个像素点赋予一个速度矢量,这样就形成了一个运动矢量场。在某一特定时刻,图像上的点与三维物体上的点一一对应,这种对应关系可以通过投影来计算得到。根据各个像素点的速度矢量特征,可以对图像进行动态分析。如果图像中没有运动目标,则光流矢量在整个图像区域是连续变化的。当图像中有运动物体时,目标和背景存在着相对运动。运动物体所形成的速度矢量必然和背景的速度矢量有所不同,如此便可以计算出运动物体的位置。需要提醒的是,利用光流法进行运动物体检测时,计算量较大,无法保证实时性和实用性。

光流法用于目标跟踪的原理:

(1)对一个连续的视频帧序列进行处理;

(2)针对每一个视频序列,利用一定的目标检测方法,检测可能出现的前景目标;

(3)如果某一帧出现了前景目标,找到其具有代表性的关键特征点(可以随机产生,也可以利用角点来做特征点);

(4)对之后的任意两个相邻视频帧而言,寻找上一帧中出现的关键特征点在当前帧中的最佳位置,从而得到前景目标在当前帧中的位置坐标;

(5)如此迭代进行,便可实现目标的跟踪;


IxVx+IyVy+It=0;

对于二维的运动场,单靠一个像素无法确定其运动矢量(Vx,Vy)根据假设三, 我们可以使用当前像素的邻域像素添加更多约束条件;如经典的Horn-Schunck光流法所加的运动平滑约束。

同时,对于二维运动场,只需包含两条或以上边缘则可以解系统方程,因此在进行光流法时,先选择好跟踪的特征点,如harris角点。

二 KLT

KLT属于光流法的一种,其前提假设与上一致

1)亮度恒定
2)时间连续或者是运动是“小运动”
3)空间一致,临近点有相似运动,保持相邻
  

很直观的讲,如果判断一个视频的相邻两帧I、J在某局部窗口w上是一样的,则在窗口w内有:I(x, y, t) = J(x', y', t+τ),亮度恒定的假设(假设1)即为了保证其等号成立不受亮度的影响,假设2是为了保证KLT能够找到点,假设3则为以下原因假设(即对于同一个窗口中,所有点的偏移量都相等):

  在窗口w上,所有(x, y)都往一个方向移动了(dx,  dy),从而得到(x', y'),即t时刻的(x, y)点在t+τ时刻为(x+dx, y+dy),所以寻求匹配的问题可化为对以下的式子寻求最小值,或叫做最小化以下式子:

  用积分来表示上述式子,以上式子可等效为:

  这个式子的含义,即找到两副图像中,在W窗口中,I、J的差异,其中I以x-d/2为中心,J以x+d/2为中心,w/2为半径的一个矩形窗口间的差异,好吧,结合我们微积分的知识,函数ε(d)要取得最小值,这个极值点的导数一定为0,即
  

的值为0,由泰勒展开的性质:

可以得到:

于是,问题转化为:

其中:

从而,问题即为:

=>

即其等式可看作为:

其中,Z为一个2*2的矩阵,e为一个2*1的向量,

为了要使d能够得到解,则Z需要满足条件,即Z*Z'矩阵可逆,其中Z'为Z矩阵的转置(ZT),在一般情况下,角点具有这样的特点。







  • 9
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
KLT(Kanade-Lucas-Tomasi)光流法是一种基于互相关的光流估计方法,它是一种基于局部区域的光流估计方法,可以用于跟踪图像中的特征点。在MATLAB中,可以使用vision.PointTracker对象来实现KLT光流法。 以下是MATLAB中使用KLT光流法进行目标跟踪的示例代码: ```matlab % 读取视频文件 videoFileReader = vision.VideoFileReader('visionface.avi'); % 创建视频播放器 videoPlayer = vision.VideoPlayer('Position',[100,100,680,520]); % 读取第一帧图像 videoFrame = step(videoFileReader); % 检测人脸并选择跟踪点 faceDetector = vision.CascadeObjectDetector(); bbox = step(faceDetector, videoFrame); points = detectMinEigenFeatures(rgb2gray(videoFrame), 'ROI', bbox); % 创建KLT跟踪器 pointTracker = vision.PointTracker('MaxBidirectionalError', 2); % 初始化跟踪器 initialize(pointTracker, points.Location, videoFrame); % 循环处理每一帧图像 while ~isDone(videoFileReader) % 读取当前帧图像 videoFrame = step(videoFileReader); % 跟踪特征点 [points, isFound] = step(pointTracker, videoFrame); visiblePoints = points(isFound, :); oldInliers = oldPoints(isFound, :); % 估计运动 [xform, oldInliers, visiblePoints] = estimateGeometricTransform(... oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4); % 更新跟踪点 setPoints(pointTracker, visiblePoints); oldPoints = visiblePoints; % 显示结果 videoFrame = insertMarker(videoFrame, visiblePoints, '+', ... 'Color', 'white'); step(videoPlayer, videoFrame); end % 释放资源 release(videoFileReader); release(videoPlayer); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值