jinyqjinyq / OpticalFlow-movingTargetDetection

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

OpticalFlow-movingTargetDetection

开发环境

  • 软件:CLion
  • 语言:C++

博客请见:https://blog.csdn.net/zw__chen/article/details/84192487

1 引言

运动目标检测在实际应用中的重要性使其成为一个热门研究课题,经过多年的研究,产生了多种运动目标检测算法,目前常用算法主要包含背景减除法、帧间差分法和光流法。很多学者基于以上三类算法提出了一些改进算法,如背景减除法中最常用的基于混合高斯模型的背景减除算法,帧间差分法中常用的三帧差分法,以及光流法中常用的金字塔 Lucas-Kanade 算法,这些算法的出现促使运动目标检测技术取得更大的进步,然而这些算法大都在特定的场合适用,而在一些复杂场景中得不到较好的检测效果,如静态背景中存在光照变化和大位移等干扰因素和动态背景中由于相机抖动引起的全局运动都降低了运动目标检测的精度,因此运动目标检测算法的研究还在继续。

2 光流场法

2.1定义

光流场法是一种常用的运动目标检测算法,通过用图像平面亮度信息的流动来描述物体的运动,成功实现了对目标的运动检测。由于光流场既包含了运动物体的速度和方向,又包含了与周围环境之间的关系信息,所以通过将运动场转换为光流场,即将光流场近似成运动场,来对图像进行相关处理。近几十年来,国内外学者对光流法进行了深入的研究,取得了较大进步。光流的概念最早可以追溯到 1950 年,由心理学家 Gibson 首先提出的,而光流算法的计算源于 1981 年 Horn 等人推导出的光流基本约束方程,所有基于梯度算法的光流法都是以此公式为基础,此方程成立有三个假设前提:(1)假设参考帧和当前帧之间的亮度保持不变;(2)假设参考帧和当前帧之间时间连续,也可以认为是运动物体的运动速度较小;(3)假设同一幅图像中子图像的像素保持相同的运动由于一个方程存在两个未知数,所以没有办法求解。因此就出现了最经典的两个算法,即Horn-Schunck 光流法和 Lucas-Kanade 光流法。

2.2基本**

利用光流场法实现目标检测的基本**是:首先计算图像中每一个像素点的运动向量,即建立整幅图像的光流场。如果场景中没有运动目标,则图像中所有像素点的运动向量应该是连续变化的;如果有运动目标,由于目标和背景之间存在相对运动,目标所在位置处的运动向量必然和邻域(背景)的运动向量不同,从而检测出运动目标。

2.3 Lucas-Kanade 光流场法

2.3.1 定义

若假定一个局部区域的像素运动是一致的,则可以用这个新的约束条件替代前文中提到的全局速度平滑约束条件。这种光流算法就叫做 Lucas-Kanade (LK) 光流法。这个算法是最常见,最流行的。它计算两帧在时间t到t+δt之间每个每个像素点位置的移动。由于它是基于图像信号的泰勒级数,这种方法称为差分,这就是对于空间和时间坐标使用偏导数。

2.3.2公式推导

图像约束方程,也是光流法的基本方程,可以写为:

I(x,y,z,t)=I(x+δx,y+δy,z+δz,t+δt)

I(x,y,z,t)  为在(x,y,z)位置的体素

我们假设移动足够的小,那么对图像约束方程使用泰勒公式,我们可以得到: 在这里插入图片描述 H.O.T.指更高阶,在移动足够小的情况下可以忽略。从这个方程中我们可以得到: 在这里插入图片描述

或者

在这里插入图片描述

我们得到:

在这里插入图片描述 Vx ,Vy ,Vz 分别是I(x,y,z,t)的光流向量中x,y,z的组成。 ∂I/∂x, ∂I/∂y, ∂I/∂z和 ∂I/∂t则是图像在(x,y,z,t)这一点向相应方向的差分。

所以

IxVx+IyVy+IzVz=−It

写做:

在这里插入图片描述

这个方程有三个未知量,尚不能被解决,这也就是所谓光流算法的光圈问题。那么要找到光流向量则需要另一套解决的方案。而Lucas-Kanade算法是一个非迭代的算法:

假设流(Vx,Vy,Vz)在一个大小为m∗m∗m(m>1)的小窗中是一个常数,那么从像素 1,2,…,n,n=m3 中可以得到下列一组方程:

Ix1Vx+Iy1Vy+Iz1Vz=−It1Ix1Vx+Iy1Vy+Iz1Vz=−It1 Ix2Vx+Iy2Vy+Iz2Vz=−It2Ix2Vx+Iy2Vy+Iz2Vz=−It2 ⋮⋮ IxnVx+IynVy+IznVz=−Itn

三个未知数但是有多于三个的方程,这个方程组自然是个超定方程,也就是说方程组内有冗余,方程组可以表示为:

在这里插入图片描述

记作: Av⃗ =−bAv→=−b

为了解决这个超定问题,我们采用最小二乘法: ATAv⃗ =AT(−b)ATAv→=AT(−b)

或者 v⃗ =(ATA)−1AT(−b)v→=(ATA)−1AT(−b) 得到 在这里插入图片描述

其中的求和是从1到n。

另外,由于LK算法假设是小位移,为了解决大位移问题,需要在多层图像缩放金字塔上求解,每一层的求解结果乘以2后加到下一层: 在这里插入图片描述

3 基于OpenCV实现L-K流光场算法

3.1 开发环境

  • 软件:CLion
  • 语言:C++

3.2 程序算法

本次作业主要实现和验证了L-K流光场算法,设计的算法流程如图3-1所示。

将光流法应用于目标跟踪可以按照如下流程实现:

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

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

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

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

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

具体流程图如下所示:

在这里插入图片描述

图3-1 算法流程图

3.3 程序结果 输入的视频(highway.mov)随机抽6帧样例如下所示: 在这里插入图片描述

输出的视频流随机抽样6帧如下所示: 在这里插入图片描述

3.4 总结

在比较理想的情况下,它能够检测独立运动的对象,不需要预先知道场景的任何信息,可以很精确地计算出运动物体的速度,并且可用于摄像机运动的情况。但光流法存在下面的缺点:有时即使没有发生运动,在外部照明发生变化时,也可以观测到光流;另外,在缺乏足够的灰度等级变化的区域,实际运动也往往观测不到。三维物体的运动投影到二维图像的亮度变化,本身由于部分信息的丢失而使光流法存在孔径问题和遮挡问题,用光流法估算二维运动场是不确定的,需要附加的假设模型来模拟二维运动场的结构;在准确分割时,光流法还需要利用颜色、灰度、边缘等空域特征来提高分割精度;同时由于光流法采用迭代的方法,计算复杂耗时,如果没有特殊的硬件支持,很难应用于视频序列的实时检测。最后,光流法的理论假设过于理想,而光流场在实际的应用中,由于存在多光源、遮挡性、噪声和透明性等多方面的原因,光流场基本方程中的灰度守恒这个假设条件是得不到满足的,因此往往无法求解出正确的光流场。并且该方法受噪声的影响较大,因而该方法多适用于目标运动速度不大,图像噪声比较小的情况。

About


Languages

Language:C++ 39.8%Language:C 25.0%Language:CMake 19.1%Language:Makefile 16.1%