文章目录

  • 1 环境
  • 2 效果
  • 3 原理
  • 4 代码

1 环境

  • Python 3.8.8
  • PyCharm 2021
  • opencv-python

2 效果

3 原理

  视频图像中的目标检测与跟踪,是计算机视觉的基础课题,同时具有广泛的应用价值。视觉目标(单目标)跟踪任务就是在给定某视频序列初始帧的目标大小与位置的情况下,预测后续帧中该目标的大小与位置。依照目标与摄像头之间的关系可分为两种场景的目标追踪:

  • 静态场景:目标检测相对简单,研究渐趋成熟。
  • 动态场景:相对复杂,当前研究领域的热点。

本文只介绍静态场景的目标追踪,动态的在后序文章中会分享。

  在静态场景中,背景是静止的,则我们可以通过背景减除(Background Subtraction)来进行预处理。例如,考虑像访客柜台这样的情况,其中静态摄像机(监控)拍摄进入或离开房间的访客数量,或者交通摄像机提取有关车辆的信息等。在所有这些情况下,首先需要单独提取人员或车辆. 从技术上讲,需要从静态背景中提取移动的前景。那么我们可以通过帧差法来计算像素差从而获取到前景对象。

  如果只有背景图像,例如没有访客的房间图像,没有车辆的道路图像等,这很容易。只需从背景中减去新图像。就可以单独获得前景对象。但在大多数情况下,可能没有这样的图像,因此我们需要从我们拥有的任何图像中提取背景。当有车辆的影子时,情况变得更加复杂。由于阴影也在移动,简单的减法也会将其标记为前景。它使事情复杂化。

  高斯混合模型分离算法(MOG)算法在一定程度上可解决上述问题,2001年,由P.KadewTraKuPong和R.Bowden在论文 “An improved adaptive background mixture model for real-time tracking with shadow detection” 中提出。MOG2算法,也是高斯混合模型分离算法,是MOG的改进算法。基于2004年发布的 “Improved adaptive Gausian mixture model for background subtraction” 和2006年发布的 “Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction” 两篇文章提出。该算法的一个重要特征是它为 每个 像素选择适当数量的高斯分布,它可以更好地适应不同场景的照明变化等。可以大家会有疑问,就是为什么一个像素也可以构成高斯分布呢,这里其实是因为我们的视频会持续一段时间,这样每个像素在每个时刻 t\boldsymbol{t}t 都有对应的状态。因此上述的 每个 像素指的是一个像素在不同时刻 t\boldsymbol{t}t 的状态。MOG算法的基本思路是基本思路:将图像分为3-5个高斯模型。如果一个像素点与任何一个高斯模型的均值 μ\boldsymbol{\mu}μ 的之差大于其3倍的标准差 σ\boldsymbol{\sigma}σ,则为前景即运动物体,否则则是背景。算法流程如下:

  • 初始各种参数。
  • 使用过去 T 帧图像构造模型。
  • 对于一个新来的像素,如果该像素点的值与其模型均值 μ\boldsymbol{\mu}μ 之差在 3∗σ\boldsymbol{3*\sigma}3∗σ 内,则属于该分布,并对其进行参数更新。
  • 如果不满足该高斯模型,重新建立一个新的高斯模型。

4 代码

使用 cv2.createBackgroundSubtractorMOG2(history = 500, varThreshold = 16, detectShadows = true) 初始化一个MOG2模型,该函数的参数如下:

  • history:用于训练背景的帧数,默认为500帧。
  • varThreshold:方差阈值,用于判断当前像素是前景还是背景。一般默认16,如果光照变化明显,如阳光下的水面,建议设为25,36。
  • detectShadows:是否检测影子,设为True为检测,False为不检测,检测影子会增加程序时间复杂度,如无特殊要求,建议设为False。

使用 cv2.getStructuringElement(cv.MORPH_ELLIPSE, (3, 3)) 初始化形态学需要的卷积核 kernel,等效成 np.ones((3, 3), np.uint8)

使用 cv2.VideoCapture(video_path) 创建一个视频读取对象capture,capture.read() 进行捕捉画面,返回值如下:

  • ret:布尔值,表示是否正确捕捉到图像帧。
  • frame:图像帧。

使用 cv2.morphologyEx(fgmask, cv.MORPH_OPEN, kernel) 进行形态学处理,这是因为MOG2检测出的前景中有许多白点(如下图),所以使用开操作对白点进行腐蚀。

使用 cv2.imshow() 展示图片,使用 cv2.waitkey(10) & 0xff == 'q' 来延长放映的时间。

代码如下:

import cv2 as cvdef tracking_by_bg_substract() :model = cv.createBackgroundSubtractorMOG2()kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (3, 3))capture = cv.VideoCapture('videos/static_bg_people.avi')while capture.isOpened() :ret, frame = capture.read()if ret :#对图像帧进行MOG2算法检测fgmask = model.apply(frame)fgmask = cv.morphologyEx(fgmask, cv.MORPH_OPEN, kernel)cv.imshow('frame', frame)cv.imshow('fgmask', fgmask)if cv.waitKey(10) & 0xff == ord('q') :breakelse :breakcapture.release()cv.destroyAllWindows()if __name__ == '__main__':tracking_by_bg_substract()

效果如下,效果还不错。

【Opencv】目标追踪——高斯混合模型分离算法(MOG)相关推荐

  1. OpenCV目标追踪

    © Fu Xianjun. All Rights Reserved. 目标跟踪任务分类 单目标跟踪 - 给定一个目标,追踪这个目标的位置. 多目标跟踪 - 追踪多个目标的位置 Person Re-ID ...

  2. 机器学习教程 之 EM算法 :高斯混合模型聚类算法 (python基于《统计学习方法》实现,附数据集和代码)

    之前写过一篇博客讲述极大似然方法, 这一方法通常适用于知道观测数据 Y Y Y,求解模型参数 θ \theta θ的场合,即 P ( Y ∣ θ ) P(Y|\theta) P(Y∣θ). 但是,在更 ...

  3. oepncv 移动目标追踪, 背景消除法,MOG,KNN

    本章内容      * 移动目标跟踪      * 1.MOG背景消除法      * 2.KNN背景消除法 输出结果: 源码: #include <opencv2/opencv.hpp> ...

  4. 基于opencv的BackgroundSubtractorMOG2和BackgroundSubtractorKNN通过背景减除来实现目标追踪

    背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤.如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获取到前景对象.但是在大多数情 ...

  5. 目标追踪-背景差算法

    mog2 算法 MOG2算法,也是高斯混合模型分离算法,是MOG的改进,算法的重要特征是:为每个像素选择适当数量的高斯分布,可以更好地适应不同场景的照明变化等.高斯分布其实就是正态分布,(Normal ...

  6. 数字图像处理拓展题目——利用Matlab实现动态目标检测 二帧差法、ViBe法、高斯混合模型法,可应用于学生递东西行为检测

    1.二帧差法实现动态目标检测 先上效果图: 利用GUI界面显示出来效果图为: 实现流程 1.利用matlab中的VideoReader函数读取视频流. 2.帧差法:获得视频帧数,用for循环对图像每相 ...

  7. 11- OpenCV进行目标追踪 (OpenCV系列) (机器视觉)

    知识要点 1. OpenCV目标跟踪算法的使用大概可以分为以下几个步骤: 创建MultiTracker对象:  trackers = cv2.legacy.MultiTracker_create() ...

  8. 【数据挖掘】高斯混合模型 ( 与 K-Means 每个步骤对比 | 初始参数设置 | 计算概率 | 计算平均值参数 | 计算方差参数 | 计算高斯分布概率参数 | 算法终止条件 )

    文章目录 I . 高斯混合模型 ( 样本 -> 模型 ) II . 高斯混合模型 ( 模型 -> 样本 ) III . 高斯混合模型 与 K-Means 迭代过程对比 IV . 高斯混合模 ...

  9. 高斯混合模型聚类算法和K-Means聚类算法

    高斯混合模型聚类算法 概念:混合高斯模型就是指对样本的概率密度分布进行估计,而估计的模型是几个高斯模型加权之和(具体是几个要在模型训练前建立好).每个高斯模型就代表了一个类(一个Cluster).对样 ...

最新文章

  1. 用C#创建Windows服务(Windows Services)
  2. keepAliveTime和线程工厂
  3. MetadataCache分析
  4. python 清空文件夹_别这样直接运行Python命令,否则电脑等于“裸奔”
  5. linux防火墙能阻止cc攻击吗,linux csf 防火墙 防止少量的ddos cc攻击很有效
  6. 【OpenCV入门指南】第六篇 轮廓检测 下
  7. JQuery语法,选择器和事件
  8. 商场客流量统计摄像头设备
  9. axure怎么存html文件怎么打开,axure 保存html文件怎么打开
  10. 打开conda环境报错:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x9a in position 317: illegal multibyt
  11. vim基本指令(一)
  12. 《易经》 数中以9最为奇妙
  13. php利用表格敬将所选择的数据显示出来,单元格下拉筛选设置/Excel对筛选后的单元格进行下拉填充...
  14. 小学数学解题思维窍门
  15. 什么是MySQL的预编译?
  16. 杯子倒水问题 -python
  17. Unity粒子特效Particle System 属性解释
  18. 火狐linux 32位,火狐浏览器32.0版本-Firefox(火狐浏览器)32.0版下载 v32.0官方版--pc6下载站...
  19. (2016年8月2号) 台风 从零开始
  20. [内附完整源码和文档] 基于Qt5的国际跳棋双人网络对战游戏

热门文章

  1. “打工人”都在用的邮件使用规范
  2. svn修改提交日志信息
  3. [web] request的Content-Type小结
  4. 元芳,你怎么看?元芳是谁?
  5. 潜入浅出--通信中的频带利用率,以MASK.MPSK作为例子
  6. python怎么统计多少字符_python统计中文字符数量的两种方法
  7. 智能信用卡还款软件是什么?和传统代还平台有什么区别?
  8. 一张图搞清楚EOS是什么怎么工作
  9. 字符串_字符串的复制
  10. python数据不足位数补0