OpenCV:视频背景减除

目录

简述

1. MOG

🔷1.1 主要特点

🔷1.2 代码示例

🔷1.3 运行效果

2. MOG2

🔷2.1 主要特点

🔷2.2 代码示例 

🔷2.3 运行效果

3. KNN

4. GMG 

5. CNT

6. LSBP

7. 如何选择适合的接口? 

🔷7.1 考虑场景的动态性

🔷7.2  考虑光照变化情况

🔷7.3 考虑实时性要求

🔷7.4 考虑物体特征

🔷7.5 考虑阴影影响

8. 资源下载 


简述

在计算机视觉领域,背景减除广泛应用于目标检测、视频监控、运动分析等任务。OpenCV提供了多种背景减除算法:

  • cv2.bgsegm.createBackgroundSubtractorMOG
  • cv2.createBackgroundSubtractorMOG2
  • cv2.createBackgroundSubtractorKNN
  • cv2.bgsegm.createBackgroundSubtractorGMG
  • cv2.bgsegm.createBackgroundSubtractorCNT
  • cv2.bgsegm.createBackgroundSubtractorLSBP

1. MOG

基于高斯混合模型(Mixture of Gaussians, MOG)的背景减除算法。该算法通过多个高斯分布来对每个像素的颜色值进行建模,以表示背景的颜色变化。随着时间推移,不断更新这些高斯分布的参数,从而适应背景的缓慢变化。

fgbg = cv2.bgsegm.createBackgroundSubtractorMOG(history=200, nmixtures=5, backgroundRatio=0.7, noiseSigma=0)

参数说明:

  • history:用于建模背景的历史帧数,默认 200。
  • nmixtures:高斯混合模型中的高斯分布数量,默认 5。
  • backgroundRatio:背景比例,用于确定哪些高斯分布属于背景,默认 0.7。
  • noiseSigma:噪声标准差,默认 0。

🔷1.1 主要特点

  • 早期的高斯混合模型实现,算法相对简单。
  • 对光照变化和背景动态变化的适应性较差。
  • 计算速度相对较快,但在复杂场景下检测精度有限。 

🔷1.2 代码示例

import cv2cap = cv2.VideoCapture('D:\\resource\\opencv\\vtest.avi')
mog = cv2.bgsegm.createBackgroundSubtractorMOG()while(True):ret, frame = cap.read()if ret == False:breakmask = mog.apply(frame)cv2.imshow('img',mask)k = cv2.waitKey(10) if k ==27:breakcap.release()
cv2.destroyAllWindows()

🔷1.3 运行效果

原始视频:

背景减除后:

2. MOG2

该接口是对 cv2.bgsegm.createBackgroundSubtractorMOG 的改进版本,同样基于高斯混合模型。它引入了一些优化机制,如自适应学习率和阴影检测,能更好地适应光照变化和背景的动态变化。

fgbg = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True)

参数说明:

  • history:用于建模背景的历史帧数,默认 500。
  • varThreshold:像素与背景模型之间的方差阈值,用于判断像素是否属于前景,默认 16。
  • detectShadows:是否检测阴影,默认 True。

🔷2.1 主要特点

  • 对光照变化和背景动态变化有更好的适应性。
  • 能够检测阴影并将其以灰色显示在前景掩码中。
  • 计算复杂度相对较高,处理速度比 cv2.bgsegm.createBackgroundSubtractorMOG 稍慢。

🔷2.2 代码示例 

import cv2cap = cv2.VideoCapture('D:\\resource\\opencv\\vtest.avi')
#mog = cv2.bgsegm.createBackgroundSubtractorMOG()
mog = cv2.createBackgroundSubtractorMOG2()while(True):ret, frame = cap.read()if ret == False:breakmask = mog.apply(frame)cv2.imshow('img',mask)k = cv2.waitKey(10) if k ==27:breakcap.release()
cv2.destroyAllWindows()

🔷2.3 运行效果

3. KNN

基于 K最近邻(K - Nearest Neighbors, KNN)算法的背景减除方法。它通过对每个像素维护一个样本集,对于新的像素值,通过查找其 K 个最近邻来判断该像素是属于背景还是前景。 

fgbg = cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=400, detectShadows=True)

参数说明:

  • history(可选):用于建模背景的历史帧数,默认值为 500。
  • dist2Threshold(可选):像素与背景样本之间的距离阈值,用于判断像素是否属于前景,默认值为 400。
  • detectShadows(可选):是否检测阴影,默认值为 True。如果设置为 True,检测到的阴影将以灰色显示在前景掩码中。

主要特点:

  • 对动态背景有较好的适应性,能快速适应背景的变化。
  • 在某些场景下计算速度比 cv2.createBackgroundSubtractorMOG2 快。
  • 对噪声有一定的鲁棒性。 

4. GMG 

结合了统计模型和贝叶斯推理的方法。它首先使用前几帧图像来初始化背景模型,然后通过逐帧更新来适应背景的变化。该算法在处理光照变化和动态背景方面有一定的优势。

fgbg = cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=120, decisionThreshold=0.8)

参数说明:

  • initializationFrames:用于初始化背景模型的帧数,默认 120。
  • decisionThreshold:决策阈值,用于判断像素是前景还是背景,默认 0.8。

主要特点:

  • 能够快速适应背景的初始变化。
  • 对于小的运动物体检测效果较好,但可能会产生较多的噪声。
  • 计算复杂度相对较高,处理速度较慢。

5. CNT

基于计数的背景减除算法。它为每个像素维护一个计数器,记录该像素值在一段时间内出现的次数。通过比较当前像素值的计数与阈值,判断该像素是属于背景还是前景。

fgbg = cv2.bgsegm.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15 * 60, isParallel=True)

参数说明:

  • minPixelStability:像素成为背景所需的最小稳定帧数,默认 15。
  • useHistory:是否使用历史信息,默认 True。
  • maxPixelStability:像素保持稳定的最大帧数,默认 15 * 60。
  • isParallel:是否并行处理,默认 True。

主要特点:

  • 计算速度非常快,适合实时应用。
  • 对光照变化有一定的鲁棒性,但在复杂场景下的检测精度可能不如其他算法。

6. LOBSTER

基于局部二值模式的背景减除算法。它通过计算像素的局部二值模式来描述像素的纹理特征,从而更好地区分背景和前景。

fgbg = cv2.bgsegm.createBackgroundSubtractorLSBP(mc=1,nSamples=20,LSBPRadius=16,Tlower=2.0,Tupper=32.0,Tinc=1.0,Tdec=0.05,Rscale=10.0,Rincdec=0.005,noiseRemovalThresholdFacBG=0.0004,noiseRemovalThresholdFacFG=0.0008
)

参数说明:

  • mc:多通道标志,默认值为 1,表示使用多通道模式。
  • nSamples:每个像素的样本数量,默认值为 20。这个参数决定了用于构建背景模型的样本数量,样本数越多,背景模型越稳定,但计算量也会相应增加。
  • LSBPRadius:LSBP 算子的半径,默认值为 16。它控制了 LBP 特征提取的邻域大小,半径越大,能捕捉到的纹理信息越丰富,但计算复杂度也会提高。
  • Tlower:前景阈值下限,默认值为 2.0。用于判断像素是否属于前景的较低阈值。
  • Tupper:前景阈值上限,默认值为 32.0。用于判断像素是否属于前景的较高阈值。
  • Tinc:阈值增加步长,默认值为 1.0。当像素被判定为前景时,背景模型的阈值会以这个步长增加。
  • Tdec:阈值减小步长,默认值为 0.05。当像素被判定为背景时,背景模型的阈值会以这个步长减小。
  • Rscale:半径缩放因子,默认值为 10.0。用于调整背景模型的更新速度。
  • Rincdec:半径缩放因子的增减步长,默认值为 0.005。用于控制半径缩放因子的动态调整。
  • noiseRemovalThresholdFacBG:背景噪声去除阈值因子,默认值为 0.0004。用于去除背景中的噪声点。
  • noiseRemovalThresholdFacFG:前景噪声去除阈值因子,默认值为 0.0008。用于去除前景中的噪声点。

主要特点:

  • 对于具有明显纹理差异的前景和背景,能够更准确地区分。
  • 利用纹理特征进行背景减除,可以在一定程度上减少由于光照变化、噪声等因素导致的误检。
  • 计算复杂度较高,处理速度相对较慢,不太适合对实时性要求极高的场景。 

7. 如何选择适合的接口? 

🔷7.1 考虑场景的动态性

如果背景基本保持不变或者变化非常缓慢,例如监控固定场景(如室内走廊、停车场等)。考虑以下接口:

  • cv2.bgsegm.createBackgroundSubtractorMOG 
  • cv2.bgsegm.createBackgroundSubtractorCNT 

当背景存在一定的动态变化,如风吹动的树叶、晃动的水面等。考虑以下接口:

  • cv2.createBackgroundSubtractorMOG2 
  • cv2.createBackgroundSubtractorKNN  

🔷7.2  考虑光照变化情况

在光照基本不变的环境中,上述提到的 :

  • cv2.bgsegm.createBackgroundSubtractorMOG 
  • cv2.bgsegm.createBackgroundSubtractorCNT 

可以满足需求,它们在光照稳定时能以高效的方式进行背景减除。

在光照剧烈变化的场景中,优先考虑:

  • cv2.createBackgroundSubtractorMOG2

它能够自适应光照的变化,通过不断调整背景模型来适应光照强度和颜色的改变。

🔷7.3 考虑实时性要求

 如实时视频监控、工业自动化中的快速检测等场景,需要算法能够在短时间内完成处理。

  • cv2.bgsegm.createBackgroundSubtractorCNT

是最佳选择,其计算速度非常快,并且支持并行处理,能够满足实时处理的需求。

当处理速度不是首要考虑因素,更注重检测的准确性时,可以选择:

  • cv2.createBackgroundSubtractorMOG2 
  • cv2.bgsegm.createBackgroundSubtractorLSBP

cv2.createBackgroundSubtractorMOG2 虽然计算复杂度较高,但能提供更准确的前景检测结果;cv2.bgsegm.createBackgroundSubtractorLSBP 基于局部二值模式,对纹理特征有较好的捕捉能力,能减少误检,但计算速度较慢。

🔷7.4 考虑物体特征

小运动物体的检测:

  • cv2.bgsegm.createBackgroundSubtractorGMG

对于小的运动物体检测效果较好,它在初始化背景模型后能快速响应小物体的运动,但可能会产生较多噪声。

对纹理特征要求较高的场景:

  • cv2.bgsegm.createBackgroundSubtractorLSBP

🔷7.5 考虑阴影影响

如果场景中阴影的存在会干扰前景物体的检测,需要选择支持阴影检测的算法:

  • cv2.createBackgroundSubtractorMOG2 
  • cv2.createBackgroundSubtractorKNN 

都具备阴影检测功能,它们可以将检测到的阴影以灰色显示在前景掩码中,避免阴影被误判为前景物体。

8. 资源下载 

通过网盘分享的文件:vtest.avi
链接: https://pan.baidu.com/s/1LqFBQUAssC9qbynf9U5LOg?pwd=csdn 提取码: csdn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14865.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot篇】基于Redis分布式锁的 误删问题 和 原子性问题

文章目录 ??Redis的分布式锁??误删问题 ??解决方法??代码实现 ??原子性问题 ??Lua脚本 ?利用Java代码调用Lua脚本改造分布式锁??代码实现 ??Redis的分布式锁 Redis的分布式锁是通过利用Redis的原子操作和特性来实现的。在分布式环境中,多个应用…

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目录 计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模块3. 软注意力与硬注意力4. 实验…

Unity笔试常考

线程同步的几种方式 1.信号量pv操作 2.互斥加锁 3.条件变量 五层网络协议指的是哪五层 1.应用层 2.运输层 3.网络层 4.链路层 5.物理层 TCP和UDP区别 tcp 面向连接,保证发送顺序,速度慢,必须在线,三次握手,4次挥手…

Docker数据卷管理及优化

一、基础概念 1.docker数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,直接将数据存在宿主机上。 2.docker数据卷的作用: 数据持久化:即使容器被删除或重建数据卷中的数据仍然存在 数据共享:多个容器可以…

【AIGC】冷启动数据与多阶段训练在 DeepSeek 中的作用

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯冷启动数据的作用冷启动数据设计 💯多阶段训练的作用阶段 1:冷启动微调阶段 2:推理导向强化学习(RL&#xff0…

Qt:项目文件解析

目录 QWidget基础项目文件解析 .pro文件解析 widget.h文件解析 widget.cpp文件解析 widget.ui文件解析 main.cpp文件解析 认识对象模型 窗口坐标系 QWidget基础项目文件解析 .pro文件解析 工程新建好之后,在工程目录列表中有⼀个后缀为 ".pro" …

BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址:BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据) BiGRU双向门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景和意义 随着全球对可再生能源需求的不断增长,光伏…

数据结构与算法-递归

单路递归 二分查找 /*** 主函数:执行二分查找。* * param a 要搜索的数组(必须是已排序的)* param target 目标值* return 返回目标值在数组中的索引;如果未找到,则返回 -1*/ public static int binarySearch(int[] …

【STM32F1】一种使用通用定时器实现各个通道独立输出不同指定数量脉冲的方法

一种使用通用定时器实现独立通道输出指定数量脉冲的方法 一种使用通用定时器实现独立通道输出指定数量脉冲的方法概述实验平台配置步骤1. 初始化定时器与GPIO2. 设置定时器工作模式3. 编写脉冲计数逻辑4. 调整参数以满足要求注意事项 代码实现电机结构体配置,GPIO配…

【Java基础】序列化、反序列化和不可变类

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:Java基础面经 📚本系列文章为个…

android apk反编译

使用解压工具解压apk,使用dex2jar解析其中的dex文件为jar文件,再使用jd-gui将class反编译为java文件 1 工具下载 dex2jar下载 https://github.com/pxb1988/dex2jar/releases 直接去github上下载最新发布版本 注意,如果后面使用过程中遇到No…

PAT乙级( 1009 说反话 1010 一元多项式求导)C语言版本超详细解析

1009 说反话 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母&#x…

C++20导出模块及使用

1.模块声明 .ixx文件为导入模块文件 math_operations.ixx export module math_operations;//模块导出 //导出命名空间 export namespace math_ {//导出命名空间中函数int add(int a, int b);int sub(int a, int b);int mul(int a, int b);int div(int a, int b); } .cppm文件…

鸿蒙接入支付宝SDK后模拟器无法运行,报错error: install parse native so failed.

鸿蒙项目接入支付宝后,运行提示error: install parse native so failed. 该问题可能由于设备支持的 Abi 类型与 C 工程中的不匹配导致. 官网error: install parse native so failed.错误解决办法 根据官网提示在模块build-profile.json5中添加“x86_64”依然报错 问…

MongoDB开发规范

分级名称定义P0核心系统需7*24不间断运行,一旦发生不可用,会直接影响核心业务的连续性,或影响公司名誉、品牌、集团战略、营销计划等,可能会造成P0-P2级事故发生。P1次核心系统这些系统降级或不可用,会间接影响用户使用…

nodejs - vue 视频切片上传,本地正常,线上环境导致磁盘爆满bug

nodejs 视频切片上传,本地正常,线上环境导致磁盘爆满bug 原因: 然后在每隔一分钟执行du -sh ls ,发现文件变得越来越大,即文件下的mp4文件越来越大 最后导致磁盘直接爆满 排查原因 1、尝试将m3u8文件夹下的所有视…

微信小程序如何使用decimal计算金额

第三方库地址:GitHub - MikeMcl/decimal.js: An arbitrary-precision Decimal type for JavaScript 之前都是api接口走后端计算,偶尔发现这个库也不错,计算简单,目前发现比较准确 上代码 导入js import Decimal from ../../uti…

unity学习29:摄像机camera相关skybox 和 Render Texture测试效果

目录 1 摄像机 1.1 每个Scene里都自带一个摄像机 camera 1.2 可以创建多个camera 1.3 下面先看backgroundtype: 2 backgroundtype: 天空盒 skybox 2.1 清除标志,清除:天空盒 自选天空盒 2.2 window /Asset Store 2.3 导入skybox 3 backgroundtype: 纯色…

ximalaya(三) playUriList值解密--webpack

本文主要介绍解密音频播放url参数。 本文仅代表个人理解,如有其他建议可在评论区沟通。 声明 仅仅记录一下自己的学习方法,不作为其他参考、更不作为商业用途。如有侵犯请联系本人删除 目标地址:aHR0cHM6Ly93d3cueGltYWxheWEuY29tL3NvdW5k…

C# Winform怎么设计串口,客户端和相机控件界面显示

首先我们必须把这个类创建好 INIAPI using System; using System.Text; using System.Runtime.InteropServices;namespace Ini {public class IniAPI{#region INI文件操作/** 针对INI文件的API操作方法,其中的节点(Section)、键(KEY&#x…