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 cv2

cap = cv2.VideoCapture('D:\\resource\\opencv\\vtest.avi')
mog = cv2.bgsegm.createBackgroundSubtractorMOG()

while(True):
    ret, frame = cap.read()
    if ret == False:
        break

    mask = mog.apply(frame)
    cv2.imshow('img',mask)

    k = cv2.waitKey(10) 
    if k ==27:
        break

cap.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 cv2

cap = cv2.VideoCapture('D:\\resource\\opencv\\vtest.avi')
#mog = cv2.bgsegm.createBackgroundSubtractorMOG()
mog = cv2.createBackgroundSubtractorMOG2()

while(True):
    ret, frame = cap.read()
    if ret == False:
        break

    mask = mog.apply(frame)
    cv2.imshow('img',mask)

    k = cv2.waitKey(10) 
    if k ==27:
        break

cap.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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

OpenCV2D 特征框架 (19)目标检测类cv::CascadeClassifier的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::CascadeClassifier 是 OpenCV 中用于对象检测的一个核心类,特别适用于基于 Haar 特征和 LBP(局部二进制模式&#xf…

大数据学习之SparkSql

95.SPARKSQL_简介 网址: https://spark.apache.org/sql/ Spark SQL 是 Spark 的一个模块,用于处理 结构化的数据 。 SparkSQL 特点 1 易整合 无缝的整合了 SQL 查询和 Spark 编程,随时用 SQL 或 DataFrame API 处理结构化数据。并且支…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(四)

#作者:闫乾苓 系列前几篇: 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》:link 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)》: lin…

ip地址是手机号地址还是手机地址

在数字化生活的浪潮中,IP地址、手机号和手机地址这三个概念如影随形,它们各自承载着网络世界的独特功能,却又因名称和功能的相似性而时常被混淆。尤其是“IP地址”这一术语,经常被错误地与手机号地址或手机地址划上等号。本文旨在…

Django开发入门 – 0.Django基本介绍

Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释: Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …

深度解析DeepSeek模型系列:从轻量级到超大规模(附DeepSeek硬件配置清单)

在人工智能领域,深度学习模型的选择对于任务的执行效率和精度至关重要。DeepSeek模型系列提供了多种不同参数量的版本,以满足不同场景下的需求。本文将详细解析DeepSeek模型系列的特点、适用场景以及硬件需求。 DeepSeek模型系列概览 DeepSeek模型系列…

树和二叉树_7

树和二叉树_7 一、leetcode-102二、题解1.引库2.代码 一、leetcode-102 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 样例输入:root [3,9,20,null,nu…

【DeepSeek】私有化本地部署图文(Win+Mac)

目录 一、DeepSeek本地部署【Windows】 1、安装Ollama 2、配置环境变量 3、下载模型 4、使用示例 a、直接访问 b、chatbox网页访问 二、DeepSeek本地部署【Mac】 1、安装Ollama 2、配置环境变量 3、下载模型 4、使用示例 5、删除已下载的模型 三、DeepSeek其他 …

<tauri><rust><GUI>基于rust和tauri,在已有的前端框架上手动集成tauri示例

前言 本文是基于rust和tauri,由于tauri是前、后端结合的GUI框架,既可以直接生成包含前端代码的文件,也可以在已有的前端项目上集成tauri框架,将前端页面化为桌面GUI。 环境配置 系统:windows 10 平台:visu…

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…

从技术体系到实践案例:浪潮信息解码金融算力演进路径

作为金融科技领域的重要参与者,浪潮信息作为核心参编单位,联合中国金电、工商银行等33家机构共同完成《中国金融科技发展报告(2024)》(以下简称蓝皮书)编撰。浪潮信息凭借在数字基础设施领域的技术积累&…

题海拾贝:【高精度】减法

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

知识库升级新思路:用生成式AI打造智能知识助手

在当今信息爆炸的时代&#xff0c;企业和组织面临着海量数据的处理和管理挑战。知识库管理系统&#xff08;Knowledge Base Management System, KBMS&#xff09;作为一种有效的信息管理工具&#xff0c;帮助企业存储、组织和检索知识。然而&#xff0c;传统的知识库系统往往依…

设计模式-生产者消费者模型

阻塞队列&#xff1a; 在介绍生产消费者模型之前&#xff0c;我们先认识一下阻塞队列。 阻塞队列是一种支持阻塞操作的队列&#xff0c;常用于生产者消费者模型&#xff0c;它提供了线程安全的队列操作&#xff0c;并且在队列为空或满时&#xff0c;能够阻塞等待&#xff0c;…

1Panel应用推荐:WordPress开源博客软件和内容管理系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

计算机毕业设计Tensorflow+LSTM空气质量监测及预测系统 天气预测系统 Spark Hadoop 深度学习 机器学习 人工智能

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

语言月赛 202308【小粉兔做麻辣兔头】题解(AC)

》》》点我查看「视频」详解》》》 [语言月赛 202308] 小粉兔做麻辣兔头 题目描述 粉兔喜欢吃麻辣兔头&#xff0c;麻辣兔头的辣度分为若干级&#xff0c;用数字表示&#xff0c;数字越大&#xff0c;兔头越辣。为了庆祝粉兔专题赛 #1 的顺利举行&#xff0c;粉兔要做一些麻…

激活函数篇 02 —— 双曲正切函数tanh

本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归&#xff1a;Sigmoid函数在分类问题中的应用 tanh ⁡ ( x ) e x − e − x e x e − x \tanh(x)\frac{e^x - e^{-x}}{e^x e^{-x}} tanh(x)exe−xex…

STM32G0B1 ADC DMA normal

目标 ADC 5个通道&#xff0c;希望每1秒采集一遍&#xff1b; CUBEMX 配置 添加代码 #define ADC1_CHANNEL_CNT 5 //采样通道数 #define ADC1_CHANNEL_FRE 3 //单个通道采样次数&#xff0c;用来取平均值 uint16_t adc1_val_buf[ADC1_CHANNEL_CNT*ADC1_CHANNEL_FRE]; //传递…