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 中可以得到下列一组方程:

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

记作:

为了解决这个超定问题,我们采用最小二乘法:

或者

得到

其中的求和是从1到n。
另外,由于LK算法假设是小位移,为了解决大位移问题,需要在多层图像缩放金字塔上求解,每一层的求解结果乘以2后加到下一层:

3 基于OpenCV实现L-K流光场算法
3.1 开发环境

  • 软件:CLion
  • 语言:C++
  • 代码:请见github: https://github.com/zhiweichen12/OpticalFlow-movingTargetDetection
    3.2 程序算法
    本次作业主要实现和验证了L-K流光场算法,设计的算法流程如图3-1所示。
    将光流法应用于目标跟踪可以按照如下流程实现:
    (1)对一个连续的视频帧序列进行处理;
    (2)针对每一个视频序列,利用一定的目标检测方法,检测可能出现的前景目标;
    (3)如果某一帧出现了前景目标,找到其具有代表性的关键特征点(可以随机产生,也可以利用角点来做特征点);
    (4)对之后的任意两个相邻视频帧而言,寻找上一帧中出现的关键特征点在当前帧中的最佳位置,从而得到前景目标在当前帧中的位置坐标;
    (5)如此迭代进行,便可实现目标的跟踪。
    具体流程图如下所示:

    图3-1 算法流程图

3.3 程序结果
输入的视频(highway.mov)随机抽6帧样例如下所示:

输出的视频流随机抽样6帧如下所示:

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

基于光流场的运动原理分析与代码实现相关推荐

  1. TFRecord简介,原理分析,代码实现?

    TFRecord简介,原理分析,代码实现? 在利用深度学习算法搭建完成网络之后,我们要对网络进行训练,要训练网络就要有训练数据,通常我们会直接对硬盘上存放数据进行操作,来fetch到网络中.这样直接从 ...

  2. 基于FFmpeg的运动视频分析

    本文来自英特尔资深软件工程师李忠,张华在LiveVideoStackCon 2018大会上的分享,由LiveVideoStack整理而成.分享中两位老师重点介绍了基于FFmpeg的运动视频分析技术架构 ...

  3. 【SemiDrive源码分析】【MailBox核间通信】51 - DCF_IPCC_Property实现原理分析 及 代码实战

    [SemiDrive源码分析][MailBox核间通信]51 - DCF_IPCC_Property实现原理分析 及 代码实战 一.RTOS 侧 Property Service 初始化流程 1.1 ...

  4. 编译原理语义分析代码_Pix2Pix原理分析与代码解读

    原理分析: 图像.视觉中很多问题都涉及到将一副图像转换为另一幅图像(Image-to-Image Translation Problem),这些问题通常都使用特定的方法来解决,不存在一个通用的方法.但 ...

  5. Holt-Winters模型原理分析及代码实现(python)

    引言 最近实验室老师让我去预测景区内代步车辆的投放量,于是乎,本着"一心一意地输出年富力强的劳动力"这份初心,我就屁颠屁颠地去找资料,然后发现了Holt-Winters模型 , 感 ...

  6. word2vec原理分析与代码公式详解

    word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,原始的论文和网上的很多分析都写的太过粗略,难以理解.现在有根据源码的具体原理分析和详细的公 ...

  7. Logistic回归分类算法原理分析与代码实现

    前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...

  8. SE 注意力模块 原理分析与代码实现

    前言 本文介绍SE注意力模块,它是在SENet中提出的,SENet是ImageNet 2017的冠军模型:SE模块常常被用于CV模型中,能较有效提取模型精度,所以给大家介绍一下它的原理,设计思路,代码 ...

  9. ECA 注意力模块 原理分析与代码实现

    前言 本文介绍ECA注意力模块,它是在ECA-Net中提出的,ECA-Net是2020 CVPR中的论文:ECA模块可以被用于CV模型中,能提取模型精度,所以给大家介绍一下它的原理,设计思路,代码实现 ...

最新文章

  1. 活动报名 | 启元星际AI顶级职业选手挑战赛周日开赛,邀您在线见证!
  2. 开发者 AI 转型指南
  3. html回顾随笔JS(*^__^*)
  4. 李彦宏的文字游戏:百度10篇论文被自然语言处理顶级会议ACL 2019录用
  5. SpringBoot中使用thymeleaf模板时select下拉框怎样查询数据库赋值
  6. 数据分析:第一轮返工潮,哪些城市疫情传播压力最大
  7. 计算机三级交换机允许中继配置,计算机三级交换机配置命令总结
  8. android开发相关资料整理【2011-11-10】
  9. 基于.NET平台常用的框架整理(收藏)
  10. 小米平板5最快有望7月发布:骁龙870/天玑12002K双版本
  11. 001 初学android开发,从搭建环境开始(jdk+eclipse+android sdk+windows7)
  12. 设置虚拟机桥接模式以及解决桥接模式上不了网以及ping不通主机的问题
  13. CSR8675项目实战:BlueAg蓝牙一拖二发射器
  14. map转字符串数组中 php_php array_map()数组函数使用说明_PHP - ucfirst
  15. AutoCAD Civil 3D-装配(标准横断面)
  16. ASO优化|五步解锁关键词选择优化正确姿势!
  17. 【​观察】加速“云矩阵”生态落地,京东云能否成为新变量?
  18. MIRACL大数运算库使用手册
  19. 微信小程序云开发 实时地图显示
  20. 笔记 | 制作windows10装机U盘,换固态硬盘,加内存条

热门文章

  1. 联盟广告平台架构及实践
  2. 向爱康投稿:读《浪潮之巅》,听潮起潮落
  3. 卡巴斯基互联网安全套装(kis 官方
  4. 《手把手教你学51单片机》之十三------1602液晶与串口的应用实例
  5. CSU人工智能与模式识别复习-绪论
  6. 从傅里叶级数到小波变换——step1.复数域的重要结论(柯西—黎曼条件)
  7. 0204原来“瘦胖子”比“真胖子”更危险
  8. spring和jump区别_jump和leap之间的区别
  9. 最近深圳出现了一些骗子公司,职场的朋友一定要小心了
  10. 接入华为游戏防沉迷,点击防沉迷弹窗后游戏闪退