《OpenCV 计算机视觉》—— 视频背景建模
文章目录
- 一、背景建模的目的
- 二、背景建模的方法
- 三、背景建模的步骤
- 四、注意事项
- 五、代码实现
一、背景建模的目的
视频背景建模的主要目的是从视频序列中提取出静态背景,以便将动态的前景对象与静态的背景进行分离。这有助于进一步分析和处理视频内容,如进行运动检测、场景理解和事件检测等。
二、背景建模的方法
在OpenCV中,有多种方法可以实现视频背景建模,其中常用的方法包括混合高斯模型(MOG)和K最近邻(KNN)算法。
-
混合高斯模型(MOG):
- 原理:混合高斯模型认为每个像素点的颜色值分布可以表示为多个高斯分布的混合。在背景建模过程中,会对每个像素点建立多个高斯分布,并根据新的像素值不断更新这些分布的参数。当新的像素值到来时,会将其与已有的高斯分布进行匹配,如果匹配成功则认为是背景,否则认为是前景。
- 实现:在OpenCV中,可以使用
createBackgroundSubtractorMOG2()
函数来创建混合高斯模型背景减除器。该函数接受一些参数,如用于训练背景的帧数(history
)、方差阈值(varThreshold
)和是否检测影子(detectShadows
)等。创建好背景减除器后,可以使用其apply()
方法对视频帧进行处理,得到前景掩码。
-
K最近邻(KNN)算法:
- 原理:KNN算法是一种基于实例的学习方法,它通过测量不同特征值之间的距离进行分类。在背景建模中,KNN算法可以用于对每个像素点进行分类,判断其属于背景还是前景。
- 实现:在OpenCV中,可以使用
createBackgroundSubtractorKNN()
函数来创建KNN背景减除器。该函数同样接受一些参数,如用于训练背景的帧数(history
)、距离阈值(dist2Threshold
)和是否检测影子(detectShadows
)等。创建好背景减除器后,同样可以使用其apply()
方法对视频帧进行处理。
三、背景建模的步骤
使用OpenCV进行视频背景建模的步骤通常包括以下几个:
- 读取视频:使用
VideoCapture
类读取视频文件或摄像头捕获的视频流。 - 创建背景减除器:根据需求选择混合高斯模型或KNN算法,并创建相应的背景减除器。
- 处理视频帧:遍历视频的每一帧,使用背景减除器的
apply()
方法对每一帧进行处理,得到前景掩码。 - 后处理:对前景掩码进行形态学处理(如腐蚀、膨胀、开运算、闭运算等)以去除噪点或填充空洞。
- 显示结果:将处理后的前景掩码或叠加在原始视频帧上的结果进行显示。
四、注意事项
- 参数选择:在选择背景建模方法时,需要根据具体场景和需求选择合适的参数。例如,在光照变化明显的场景中,可能需要调整方差阈值或距离阈值以提高模型的鲁棒性。
- 实时性:背景建模算法需要能够处理实时视频流,并在短时间内给出结果。因此,在选择算法时需要考虑其计算复杂度和处理速度。
- 模型更新:背景模型需要随着视频帧的更新而不断更新,以适应场景的变化。在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/141829262?spm=1001.2014.3001.5502
- 图像轮廓检测
- https://blog.csdn.net/weixin_73504499/article/details/141873522?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)用于计算加权和…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...