当前位置: 首页 > news >正文

《OpenCV 计算机视觉》—— 视频背景建模

文章目录

    • 一、背景建模的目的
    • 二、背景建模的方法
    • 三、背景建模的步骤
    • 四、注意事项
    • 五、代码实现

一、背景建模的目的

视频背景建模的主要目的是从视频序列中提取出静态背景,以便将动态的前景对象与静态的背景进行分离。这有助于进一步分析和处理视频内容,如进行运动检测、场景理解和事件检测等。

二、背景建模的方法

在OpenCV中,有多种方法可以实现视频背景建模,其中常用的方法包括混合高斯模型(MOG)和K最近邻(KNN)算法。

  1. 混合高斯模型(MOG)

    • 原理:混合高斯模型认为每个像素点的颜色值分布可以表示为多个高斯分布的混合。在背景建模过程中,会对每个像素点建立多个高斯分布,并根据新的像素值不断更新这些分布的参数。当新的像素值到来时,会将其与已有的高斯分布进行匹配,如果匹配成功则认为是背景,否则认为是前景。
    • 实现:在OpenCV中,可以使用createBackgroundSubtractorMOG2()函数来创建混合高斯模型背景减除器。该函数接受一些参数,如用于训练背景的帧数(history)、方差阈值(varThreshold)和是否检测影子(detectShadows)等。创建好背景减除器后,可以使用其apply()方法对视频帧进行处理,得到前景掩码。
  2. K最近邻(KNN)算法

    • 原理:KNN算法是一种基于实例的学习方法,它通过测量不同特征值之间的距离进行分类。在背景建模中,KNN算法可以用于对每个像素点进行分类,判断其属于背景还是前景。
    • 实现:在OpenCV中,可以使用createBackgroundSubtractorKNN()函数来创建KNN背景减除器。该函数同样接受一些参数,如用于训练背景的帧数(history)、距离阈值(dist2Threshold)和是否检测影子(detectShadows)等。创建好背景减除器后,同样可以使用其apply()方法对视频帧进行处理。

三、背景建模的步骤

使用OpenCV进行视频背景建模的步骤通常包括以下几个:

  1. 读取视频:使用VideoCapture类读取视频文件或摄像头捕获的视频流。
  2. 创建背景减除器:根据需求选择混合高斯模型或KNN算法,并创建相应的背景减除器。
  3. 处理视频帧:遍历视频的每一帧,使用背景减除器的apply()方法对每一帧进行处理,得到前景掩码。
  4. 后处理:对前景掩码进行形态学处理(如腐蚀、膨胀、开运算、闭运算等)以去除噪点或填充空洞。
  5. 显示结果:将处理后的前景掩码或叠加在原始视频帧上的结果进行显示。

四、注意事项

  1. 参数选择:在选择背景建模方法时,需要根据具体场景和需求选择合适的参数。例如,在光照变化明显的场景中,可能需要调整方差阈值或距离阈值以提高模型的鲁棒性。
  2. 实时性:背景建模算法需要能够处理实时视频流,并在短时间内给出结果。因此,在选择算法时需要考虑其计算复杂度和处理速度。
  3. 模型更新:背景模型需要随着视频帧的更新而不断更新,以适应场景的变化。在OpenCV中,可以通过设置学习速率(learningRate)来控制模型的更新速度。

五、代码实现

  • 采用 混合高斯模型(MOG) 方法实现视频背景建模

  • 可通过以下链接获取视频

    • 链接: https://pan.baidu.com/s/1OUT7diKBhlpeqasLErgi2w?pwd=nqgr
    • 提取码: nqgr
  • 下面是代码中涉及到的一些方法的文章介绍

    • 图像形态学(膨胀、腐蚀、开运算、闭运算)
      • https://blog.csdn.net/weixin_73504499/article/details/141829262?spm=1001.2014.3001.5502
    • 图像轮廓检测
      • https://blog.csdn.net/weixin_73504499/article/details/141873522?spm=1001.2014.3001.5502
  • 完整代码

    import cv2cap = cv2.VideoCapture('test.avi')"""
    getstructuringElement(shape,ksize,anchor=None)得到一个卷积核。主要用于后续的腐蚀、膨胀、开、闭等运算。
    参数:shape:设定卷积核的形状,可选如下三个参数:①:MORPH_RECT(矩形卷积核)②:MORPH_CROSS(十字形卷积核)③:MORPH ELLIPSE(椭圆形卷积核)ksize:设定卷积核的大小、anchor:表示描点的位置:一般c=1,表示描点位于中心
    """kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))# 创建混合高斯模型,用于背景建模
    fgbg = cv2.createBackgroundSubtractorMOG2()while (True):ret, frame = cap.read()     # ret:True表示正常读取到图像,frame:从视频中获取当前一帧图片cv2.imshow('frame', frame)fgmask = fgbg.apply(frame)  # 视频处理cv2.imshow('fgmask', fgmask)fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)   # 开运算去噪点,先腐蚀后膨胀。cv2.imshow('fgmask_new', fgmask_new)# 寻找视频中行走人的轮廓_, contours, h = cv2.findContours(fgmask_new, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍历所有轮廓for c in contours:# 计算各轮廓的周长perimeter = cv2.arcLength(c, True)if perimeter > 188:  # 找到人的矩形框x, y, w, h = cv2.boundingRect(c)# 画出这个短形fgmask_new_rect = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示效果cv2.imshow('fgmask_new_rect', fgmask_new_rect)# 等待100毫秒以检查是否有键盘输入。如果按下ESC键(ASCII码为27),则退出循环。k = cv2.waitKey(100)if k == 27:break
    
  • 结果如下:
    在这里插入图片描述

相关文章:

《OpenCV 计算机视觉》—— 视频背景建模

文章目录 一、背景建模的目的二、背景建模的方法三、背景建模的步骤四、注意事项五、代码实现 一、背景建模的目的 视频背景建模的主要目的是从视频序列中提取出静态背景,以便将动态的前景对象与静态的背景进行分离。这有助于进一步分析和处理视频内容,…...

【Mac】和【安卓手机】 通过有线方式实现投屏

Mac 和 安卓手机 实现投屏(有线) 1.下载HomeBrew /bin/bash -c "$(curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/install/master/install.sh)"2.安装Scrcpy brew install scrcpy3.安装adb brew install android-platfor…...

GitHub flow工作流

github.com github.com使用自己版本的标记语法,它提供了一组额外的有用的 特性,其中许多特性使处理github.com上的内容更加容易。 用户名-提及 键入一个符号,后跟一个用户名,将通知此人前来查看评论。 这叫做“提及”&#x…...

【Qt笔记】QFrame控件详解

目录 引言 一、QFrame的基本特性 二、QFrame的常用方法 2.1 边框形状(Frame Shape) 2.2 阴影样式(Frame Shadow) 2.3 线条宽度(Line Width) 2.4 样式表(styleSheet) 三、QFrame的应用场景 四、应用…...

【二十八】【QT开发应用】模拟WPS Tab

WidgetBase 类旨在实现窗口的可调整大小功能,使用户能够手动改变窗口的尺寸。该类通过以下机制实现窗口缩放效果:当鼠标移动至窗口边缘时,鼠标指针样式会动态改变以指示可调整大小的方向。用户在边缘区域按下鼠标左键后,可以通过拖…...

PyQt入门指南四 事件处理机制详解

1. 事件处理概述 在PyQt中,事件处理是实现交互性的关键部分。事件可以是用户的操作(如点击按钮、键盘输入),也可以是系统的通知(如窗口最小化、定时器超时)。PyQt使用信号(Signals)…...

【24最新亲试】ubuntu下载go最新版本

系列综述: 💞目的:本系列是个人整理为了工具配置的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于Ubuntu 升级 golang 版本完美步骤进行的,每个知识点的修…...

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读可重复读MVCC会出现幻读的…...

STM32 Hal库SDIO在FATFS使用下的函数调用关系

STM32 Hal库SDIO在FATFS使用下的函数调用关系 本文并不将FATFS的相关接口操作,而是将HAL在使用FATFS通过SDIO外设管理SD卡时,内部函数的调用逻辑,有助于当我们使用CUBEMX生成FATFS读取SD卡的代码时无法运行时Debug。本文也会说明一些可能出现…...

网络基础知识笔记(五)接口管理

接口管理 1. 物理层的功能 物理层要解决的三个问题: 1-信号: 模拟信号,数字信号(一组有规律变化的电流脉冲) 2-传输介质: 同轴电缆,双绞线(电信号,电口),光纤(光信号,光口),(空气)电磁波(WiFi,…...

网站集群批量管理-密钥认证与Ansible模块

一、集群批量管理-密钥认证 1、概述 管理更加轻松:两个节点,通过密钥形式进行访问,不需要输入密码,仅支持单向. 服务要求(应用场景): 一些服务在使用前要求我们做秘钥认证.手动写批量管理脚本. 名字: 密钥认证,免密码登录,双机互信. 2、原理 税钥对…...

TCP四次挥手过程详解

TCP四次挥手全过程 有几点需要澄清: 1.首先,tcp四次挥手只有主动和被动方之分,没有客户端和服务端的概念 2.其次,发送报文段是tcp协议栈的行为,用户态调用close会陷入到内核态 3.再者,图中的情况前提是双…...

在 MySQL 中处理和优化大型报告查询经验分享

在 MySQL 数据库的使用过程中,我们经常会遇到需要生成大型报告的情况,这些查询可能涉及大量的数据和复杂的计算,对数据库的性能提出了很高的要求。 一、问题背景 大型报告查询通常具有以下特点: 数据量大:涉及大量的…...

数字图像处理:空间域滤波

1.数字图像处理:空间域滤波 1.1 滤波器核(相关核)与卷积 图像上的邻域计算 线性空间滤波的原理 滤波器核(相关核)是如何得到的? 空间域的卷积 卷积:滤波器核与window中的对应值相乘后所有…...

【easypoi 一对多导入解决方案】

easypoi 一对多导入解决方案 1.需求2.复现问题2.1校验时获取不到一对多中多的完整数据2.2控制台报错 Cannot add merged region B5:B7 to sheet because it overlaps with an existing merged region (B3:B5). 3.如何解决第二个问题处理: Cannot add merged region …...

DDOS攻击会对网站服务器造成哪些影响?

DDOS攻击作为日常生活正比较常见的网络攻击类型,可以让多台计算机在同一时间内遭受到攻击,下面小编就带领大家一起来了解一下DDOS攻击会对网站服务器造成哪些影响吧! 首先DDOS攻击在进行攻击的过程中,可以对源IP地址进行伪造&…...

linux基础指令的认识

在正式学习linux前,可以简单认识一下linux与win的区别 win:是图形界面,用户操作更简单;在刚开始win也是黑屏终端 指令操作,图形界面就是历史发展的结果。Linux:也存在图形界面比如desktop OS;但…...

html5 + css3(下)

目录 CSS基础基础认识体验cssCSS引入方式 基础选择器选择器-标签选择器-类选择器-id选择器-通配符 字体和文本样式1.1 字体大小1.2 字体粗细1.3 字体样式(是否倾斜)1.4 常见字体系列(了解)1.5 字体系列拓展-层叠性font复合属性文本…...

828华为云征文|部署个人文档管理系统 Docspell

828华为云征文|部署个人文档管理系统 Docspell 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 Docspell3.1 Docspell 介绍3.2 Docspell 部署3.3 Docspell 使用…...

【深度学习】—激活函数、ReLU 函数、 Sigmoid 函数、Tanh 函数

【深度学习】—激活函数、ReLU 函数、 Sigmoid 函数、Tanh 函数 4.1.2 激活函数ReLU 函数参数化 ReLU Sigmoid 函数背景绘制 sigmoid 函数Sigmoid 函数的导数 Tanh 函数Tanh 函数的导数总结 4.1.2 激活函数 激活函数(activation function)用于计算加权和…...

7.4.分块查找

一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如&#xff1a…...

dify打造数据可视化图表

一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...