各位同学好,今天和大家分享一下opencv背景建模相关操作。主要介绍两种背景建模方法,帧差法和混合高斯模型。

案例简介:现有一份路口摄像机拍摄的行人流视频,通过背景建模方法,区分背景和前景,完成行人识别。

数据集链接:https://pan.baidu.com/s/1xPg1nQ0Ic_P-mGvdFD0t2w    提取码:1234


1. 方法介绍

背景建模需要满足一定条件,保证摄像机拍摄位置不变,保证背景是基本不发生变化的。如路口的监控摄像机,只有车流人流等前景部分能发生移动,而马路树木等背景不能发生移动。

判断视频中前景和背景的方法主要有两种:帧差法、混合高斯模型

1.2 帧差法

如下图,摄像机拍摄获取一帧一帧的连续图像,需要摄像机识别出,哪些部分是运动的,哪些部分是静止的。在摄像机拍摄位置不变的前提下,一个物体位置发生了变化,那么像素点数值也会发生变化;不发生运动的物体,它的像素点数值不基本会发生的变化。

由于场景中的目标在运动,位置产生了差异,摄像头捕捉到的图像不同。该算法通过对时间上连续的两帧图像进行差分算法,不同帧对应的像素点相减,判断灰度差异的绝对值的变化情况,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。

帧差法公式如下:

 代表像素点坐标, 代表第n帧图像, 代表第n-1帧图像,差分结果为 。如果差分结果大于阈值 ,将该像素点指定成255白点,代表前景;否则指定为0,代表背景

帧差法缺点:

第一,如果图像中存在噪音点,帧差法会引入噪音。第二,如上图右侧,人的轮廓是白色,但轮廓内是黑色的,因为人在前后两帧图像中的位置变化很小,会存在空洞问题。帧差法不常用。


1.2 混合高斯模型

在进行前景检测前,先对背景进行训练,对图像中每个背景采用一个混合高斯模型进行模拟,每个背景的混合高斯模型的个数可以自适应。然后在测试阶段对新来的像素进行GMM匹配,如果该像素值能够匹配其中一个高斯,则认为是背景,否则认为是前景。由于整个过程GMM模型在不断更新学习中,所以对动态背景具有一定的鲁棒性,整体的检测效果会得到提升。

可以简单理解一下。在图像中判断前景和背景,比如在运动过程中,人服从一种分布,背景也服从一种分布。判断视频中的像素点符合哪一种分布,符合运动的就判断是前景,符合静止的就判断为背景。

然而,背景的实际分布应当是多个高斯分布混合在一起的每个高斯模型也有其对应的权重。下图左侧是图像背景满足的两种分布,得到右侧的结果也是不同的,两种分布需要对应不同的权重。虽然整体的背景是由多个高斯分布融合在一起的,但每个分布所占的权重不一定都相同。权重是由图像中像素点的个数决定的。

对于视频中某一块区域的一个像素点来说,虽然在视频中的位置不发生改变,但它的值会发生变化。像素点值的变化情况应当符合高斯分布


(1)混合高斯模型的学习方法

1. 首先初始化每个高斯模型矩阵参数。均值,标准差

2. 取视频中T帧数据图像,用来训练高斯混合模型。来了第一个像素点之后用它来当作第一个高斯分布。如:

3. 当后面来的像素值,与前面已有的高斯的均值比较,如果该像素点的值与其模型均值差在3倍的方差内,则属于该分布,并对其进行参数更新。

如:第二帧的像素点的值为105,比较 ,因此第二帧的像素点属于第一帧像素的分布,因此这两个数据归纳在一起,更新第一个分布的均值,标准差

4. 如果下次来的像素点不满足当前的高斯分布,用它来创建一个新的高斯分布

如:第三帧的像素点的值为200,不满足更新后,那么创建一个新的高斯分布。如:

一般情况下,高斯分布的个数设置3-5个,过多的话结果不好


(2)混合高斯模型测试方法

在测试阶段,对新来的像素点的值,与学习好了的混合高斯模型中的每一个均值比较,如果差值在2倍的方差之间,就认为是背景,否则认为是前景。将前景赋值为255,背景赋值为0


2. 实战--行人检测

混合高斯模型背景建模方法

cv2.createBackgroundSubtractorMOG2().apply(image) 

自定义卷积核

rectkernel = cv2.getStructuringElement(shape, ksize, anchor=None)

shape: 卷积核形状。矩形:MORPH_RECT,十字型:MORPH_CROSS,椭圆形MORPH_ELLIPSE

ksize: 卷积核大小

anchor:坐标(x,y),元素内的锚定位置。默认值为(-1,-1),即结构化元素的中心。

import numpy as np
import cv2
# 指定文件夹
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\opencv\\img\\class'
# 获取文件夹中某个视频
video = cv2.VideoCapture(filepath + '\\test.avi')
# 自定义卷积核--矩形,用于形态学处理
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
# 创建混合高斯模型用于背景建模
back = cv2.createBackgroundSubtractorMOG2()
# 读取每一帧并处理
while True:ret, frame = video.read() #每次读取一帧,返回是否打开和每帧图像img = back.apply(frame) #背景建模# 开运算(先腐蚀后膨胀),去除噪声img_close = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)# 轮廓检测,获取最外层轮廓,只保留终点坐标contours,hierarchy = cv2.findContours(img_close,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# 计算轮廓外接矩形for cnt in contours:# 计算轮廓周长length = cv2.arcLength(cnt,True)if length>188:# 得到外接矩形的要素x,y,w,h = cv2.boundingRect(cnt)# 画出这个矩形,在原视频帧图像上画,左上角坐标(x,y),右下角坐标(x+w,y+h)cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)# 图像展示cv2.imshow('frame',frame) # 原图cv2.imshow('img',img)  # 高斯模型图# 设置关闭条件,一帧200毫秒k = cv2.waitKey(100) & 0xffif k == 27:  #27代表退出键ESCbreak
# 释放资源
video.release()
cv2.destroyAllWindows()

某一帧的效果图如下

【opencv】(11) 背景建模,帧差法、混合高斯模型,实战:行人检测,附python完整代码和数据集相关推荐

  1. opencv进阶-背景建模-(帧差法与混合高斯模型)

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

  2. 视频目标跟踪算法matlab仿真,对比二帧差法,三帧差法,混合高斯法以及Vibe算法

    目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 1.1二帧差法 帧间差分法是一种通过对视频图像序列的连续两帧图像做差分运算获取运动目标轮廓的方法.当监控场景中出现异常目标运动 ...

  3. 【opencv】(9) 图像识别实战:银行卡数字识别,附python完整代码和数据集

    各位同学大家好,今天我和大家分享一下opencv机器视觉实战项目,识别银行卡上的数字,该方法也同样适用于车牌数字识别. 数据集免费: https://download.csdn.net/downloa ...

  4. 【yolov4目标检测】(4) opencv+yolov4-tiny 实现选择性目标检测,附python完整代码

    各位同学好,今天和大家分享一下如何使用 opencv 调用 yolov4-tiny 目标检测方法,并对指定类别进行检测.用b站的视频做测试. 点击按钮 'all',按钮变红色,对所有的类别检测 点击按 ...

  5. 【opencv】(12) 光流估计,行人轨迹跟踪,附python完整代码

    1. 光流估计 1.1 方法介绍 光流:空间运动物体在观测成像平面上的像素运动的瞬时速度.根据各个像素点的速度矢量特征,可以对图像进行动态分析,例如目标跟踪. 如果下面这辆车正向我们缓缓开来,右图是车 ...

  6. 【机器视觉案例】(11) 眨眼计数器,人脸关键点检测,附python完整代码

    各位同学好,今天和大家分享一下如何使用 mediapipe+opencv 实现眨眼计数器.先放张图看效果. 下图左侧为视频图像,右侧为平滑后的人眼开合比曲线.以左眼为例,若眼眶上下边界的距离与左右边界 ...

  7. 【opencv】(13) 案例:停车场空余车位检测,附python完整代码

    各位同学好,今天和大家分享一下如何使用Opencv完成停车场的车位检测,及空余车位计数,先放张图看效果. 红框代表该车位有车,绿框代表该车位空余,左上角记录有几个空余车位,黄色数字代表该车位内的像素个 ...

  8. 【yolov3目标检测】(3) opencv+yolov3 检测交通路况,附python完整代码

    各位同学好,今天和大家分享一下如何使用 opencv 调用 yolov3 模型,加载网络权重,很方便地实现 yolov3 目标检测.先放张图看效果. 使用的网上找的行车记录仪视频做测试,数据集采用CO ...

  9. opencv背景建模(混合高斯模型)

    背景建模 帧差法 由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同.该类算法对时间上连续的两帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为 ...

最新文章

  1. scikit对超参数模型优化对比(网格搜索与随机搜索对比)
  2. 更新自定义表时的通用锁对象
  3. 简单性与鲁棒性–在锁定文件处理中展示
  4. 【入门6】函数与结构体(今天刷洛谷了嘛)
  5. 数仓无损压缩算法:gzip算法
  6. Java代码中的注释详解
  7. aix服务器设备型号,IBM产品系列和AIX系统版本
  8. 比芒果广告还要专业的广告管理系统:Keymob
  9. 数学建模数据驱动之统计学预备知识
  10. 王恩东:摩尔定律的终结本质上是没有革命性技术
  11. MATLAB完美画图:改变坐标轴刻度的显示数值,常数函数的作图
  12. python04-集合与字典
  13. Html5 1.4 figure和figcaption的实例
  14. 基于Springboot+mybatis+mysql+html教育培训中心教学系统
  15. 微信小程序分享到朋友圈,在朋友圈打开报错 error code -501023
  16. centOS关机重启,保存内存中数据
  17. VM8 asdebug.js:1 GET http://192.168.1.106:7101/GOODS/G-F-Kill net::ERR_CONNECTION_REFUSED
  18. JUST-HLL战队 电控视觉培训 第一周
  19. python模拟登录网站_Python爬虫之模拟登录wechat
  20. c# opencv车牌识别_opencv +数字识别

热门文章

  1. 宠物小精灵 android游戏,宠物小精灵官方版
  2. 云计算——网络布线(1)
  3. 六级高频词汇——Group07
  4. 对智博教育的midia-class(奥义多媒体教室)(0ss-midia-class)的破解②(共两部分)
  5. MATLAB中关于函数intlinprog的使用
  6. android NFC读取UID
  7. js中遍历数组加到新数组_JS几种数组遍历方式总结
  8. 译文:身未动,心已知
  9. abaqus算界面脱粘_Abaqus 粘聚力模型(Cohesive Model)
  10. 非IT人员 制作精美ICO图标,文件夹 U盘 图标