《深度学习》OpenCV 背景建模 原理及案例解析
目录
一、背景建模
1、什么是背景建模
2、背景建模的方法
1)帧差法(backgroundSubtractor)
2)基于K近邻的背景/前景分割算法BackgroundSubtractorKNN
3)基于高斯混合的背景/前景分割算法BackgroundSubtractorMOG2
3、步骤
1)初始化背景模型
2)处理每一帧图像
3)计算帧差图像
4)二值化处理
5)前景检测
6)更新背景模型
7)重复以上步骤
二、案例实现
1、直接来看完整代码
运行结果:
2、上述卷积核形态
1)矩形卷积核 MORPH_RECT
2)十字形卷积核 MORPH_CROSS
3)椭圆形卷积核 MORPH_ELLIPSE
一、背景建模
1、什么是背景建模
背景建模是指通过分析视频序列中的像素值变化情况,从中提取出静态背景部分,并将其用于目标检测、运动跟踪等计算机视觉任务中。在实际应用中,背景建模常用于视频监控、行人检测、车辆识别等领域。
在视频中,背景通常被定义为相对稳定的部分,例如墙壁、地面或天空等。背景建模的目标是将动态的前景对象与静态的背景进行分离,以便进一步分析和处理。
2、背景建模的方法
1)帧差法(backgroundSubtractor)
该方法将连续的视频帧与背景进行比较,通过像素值的差异来提取前景目标。当像素差异超过设定的阈值时,将该像素标记为前景。该方法简单直观,适用于简单场景和静态背景。
帧差法非常简单,但是会引入噪音和空洞(人物中间是黑色的)问题

2)基于K近邻的背景/前景分割算法BackgroundSubtractorKNN
该方法主要通过对每个像素周围的邻近像素进行聚类来建模背景。该算法将每个像素看作一个样本点,在每次输入新的观测帧时,将其与背景模型进行比较,并根据像素值的差异度量其是否为前景。BackgroundSubtractorKNN算法具有较快的处理速度和一定的鲁棒性,适用于实时背景建模和前景检测。
3)基于高斯混合的背景/前景分割算法BackgroundSubtractorMOG2
它假设每个像素的背景像素值服从多个高斯分布。算法通过对每个像素进行建模,并根据新的观测值进行更新,最终得到背景模型。当新的观测值与背景模型不匹配时,将其标记为前景。
BackgroundSubtractorMOG2算法能够自适应地调整模型的数量和混合权重,适用于复杂场景和动态背景。
3、步骤
1)初始化背景模型
从视频序列或摄像头中获取第一帧图像作为初始背景图像。
2)处理每一帧图像
获取下一帧图像,将其与背景图像进行比较。
3)计算帧差图像
将当前帧图像与背景图像进行像素级别的差分计算,得到帧差图像。
4)二值化处理
将帧差图像转换为二值图像,根据设置的阈值将差异像素标记为前景或背景。
5)前景检测
根据二值化处理得到的前景图像,可以进行一系列处理,如轮廓检测、面积过滤等,以获得更精确的前景区域。
6)更新背景模型
在每一帧图像处理后,更新背景模型,可以采用移动平均或其他方法来更新背景的估计。
7)重复以上步骤
持续处理每一帧图像,直到视频序列结束或达到设定的停止条件。
二、案例实现
1、直接来看完整代码
import cv2
# 经典的测试视频
cap = cv2.VideoCapture('test.avi') # 打开视频文件,或者打开摄像头
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(3, 3)) # 设置卷积核形态,cv2.MORPH_CROSS表示设置的是十字形卷积核,大小为3*3
fgbg = cv2.createBackgroundSubtractorMOG2() # 创建混合高斯模型,用于背最建模,从视频帧中分离出前景对象。while 1: # 定义一个死循环,用于反复从视频中提取出每一帧画面ret, frame = cap.read() # 读取视频文件的每一帧画面,返回值ret为True表示正常读取到图像,frame表示从视频中获取当前一帧图片cv2.imshow( 'frame',frame) # 展示读取到的每一帧画面,以此来构成视频的画面fgmask = fgbg.apply(frame) # 调用高斯混合模型中的用法apply对获取到的每一帧图像进行前景背景分隔算法,生成一个背景掩码,这个背景掩码的大小是与输入图像大小相同的二值图像,前景为白色,背景为黑色cv2.imshow('fgmask', fgmask) # 展示背景掩码对应的图像fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN,kernel) # 上述生成的掩码图像有很多噪声点,此处使用开运算,即先腐蚀后膨胀去除噪声点cv2.imshow( 'fgmask1',fgmask_new) # 展示处理完的图像# 寻找视频中的轮廓_,contours, h = cv2.findContours(fgmask_new, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 对上述处理完的图像进行轮廓检测,cv2.RETR_EXTERNAL表示只检测最外侧轮廓,cv2.CHAIN_APPROX_SIMPLE表示删除轮廓上冗余点来简化形状,只保留端点,并用线段连接# _表示修改后的图像,受OpenCV版本影响可能没有,contours是一个列表存放提取到的每一个轮廓,坐标点集的形式,h表示轮廓的层级信息for c in contours: # 遍历每一个轮廓perimeter = cv2.arcLength(c,True) # 计算轮廓周长if perimeter > 188: # 判断轮廓周长的大小,用来筛选周长大于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) # 展示绘制的图像k = cv2.waitKey(60)if k == 27: # 勇于接收键盘esc键,以此来中断死循环break
运行结果:

2、上述卷积核形态
1)矩形卷积核 MORPH_RECT

2)十字形卷积核 MORPH_CROSS

3)椭圆形卷积核 MORPH_ELLIPSE

相关文章:
《深度学习》OpenCV 背景建模 原理及案例解析
目录 一、背景建模 1、什么是背景建模 2、背景建模的方法 1)帧差法(backgroundSubtractor) 2)基于K近邻的背景/前景分割算法BackgroundSubtractorKNN 3)基于高斯混合的背景/前景分割算法BackgroundSubtractorMOG2 3、步骤 1)初…...
机器学习(1):机器学习的概念
1. 机器学习的定义和相关概念 机器学习之父 Arthur Samuel 对机器学习的定义是:在没有明确设置的情况下,使计算机具有学习能力的研究领域。 国际机器学习大会的创始人之一 Tom Mitchell 对机器学习的定义是:计算机程序从经验 E 中学习&#…...
0. Pixel3 在Ubuntu22下Android12源码拉取 + 编译
0. Pixel3 在Ubuntu22下Android12源码拉取 编译 原文地址: http://www.androidcrack.com/index.php/archives/3/ 1. 前言 这是一个非常悲伤的故事, 因为一个意外, 不小心把之前镜像的源码搞坏了. 也没做版本管理,恢复不了了. 那么只能说是重新做一次. 再者以前的镜像太老旧…...
ip经过多个服务器转发会网速变慢吗
会的,IP经过多个服务器转发时,网速通常会变慢,主要原因包括: 增加的延迟: 每经过一个服务器,数据包就需要额外的时间进行处理和转发。这种处理时间和网络延迟会累积,导致整体延迟增加。 带宽限制…...
mongodb通过mongoimport导入JSON文件数据
目录 一、概念 二、mongoimport导入工具 三、导入命令 一、概念 MongoDB是一个流行的开源文档数据库,它支持JSON格式的文档,非常适合存储和处理大量的非结构化数据。在实际应用中,我们经常需要将大量的数据批量导入到MongoDB中。mongoimpo…...
【Qt】控件概述 (1)
控件概述 1. QWidget核心属性1.1核心属性概述1.2 enable1.3 geometry——窗口坐标1.4 window frame的影响1.4 windowTitle——窗口标题1.5 windowIcon——窗口图标1.6 windowOpacity——透明度设置1.7 cursor——光标设置1.8 font——字体设置1.9 toolTip——鼠标悬停提示设置1…...
ping基本使用详解
在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为: 用来检测网络的连通情况和分析网络速度根据域名得到服务器 IP根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量。我们通常会用它来直接 ping ip 地址,来测试网络的连…...
Win10之解决:设置静态IP后,为什么自动获取动态IP问题(七十八)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...
【AI论文精读1】针对知识密集型NLP任务的检索增强生成(RAG原始论文)
目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构(用一个例子来阐明)场景例子:核心点: 五、方法 (架构各部分详解)5.1 模型1. RAG-Sequence Model2. RAG-Toke…...
踩坑spring cloud gateway /actuator/gateway/refresh不生效
版本 java version: 17 spring boot: 3.2.x spring cloud: 2023.0.3 现象 参考Spring Cloud Gateway -> Actuator API -> Refreshing the Route Cache 说明,先修改routes配置再调用/actuator/gateway/refresh,接口返回200 status,但…...
【STM32开发环境搭建】-3-STM32CubeMX Project Manager配置-自动生成一个Keil(MDK-ARM) 5的工程
目录 1 KEIL(MDK-ARM) 5 Project工程设置 2 MCU和嵌入式软件包的选择 3 Code Generator 3.1 STM32Cube Firmware Library Package 3.2 Generated files 3.3 HAL Settings 3.4 Template Settings 4 Advanced Settings 5 自动生成的KEIL(MDK-ARM) 5 Project工程目录 结…...
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
Java的学习(语法相关)
字符串存储的问题 char 和字符串都是字符的集合,它们之间的确有相似性,但在 Java 中它们有着不同的存储机制和处理方式。让我从 char 和 String 的本质区别入手来解释。 1. char 和 String 的区别 char 是基本类型:char 是 Java 中的基本数据…...
简单的springboot 编写Socket服务接口
简单的springboot 编写Socket服务接口 1.需求 我们项目中有部分老接口为票据接口,其中实现为java socket形式进行实现,但是其中大部分信息都是原始公司封装的包进行实现的,想要修改非常费劲,所以此处简单了解了一下socket&#…...
【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)
1. 前言 忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。 …...
VS Code使用Git Bash终端
Git Bash可以运行linux命令,在VS Code的终端界面,找到号旁边的箭头,就能直接切换了 当然,前提是安装了Git Bash,并且在资源管理器里,能鼠标右键出"Git Bash Here"...
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.mapset(模拟实现)
1.对红黑树进行改造 1.1treenode模板参数改变 之前构建treenode模板参数传的是class k,class v(set为k,k;map是k,v),现在直接用T代替 template<class T> //这里直接传了T作为模板参数,T可能是pai…...
【C++】多态(下)
个人主页~ 多态(上)~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…...
基于四种网络结构的WISDM数据集仿真及对比:Resnet、LSTM、Shufflenet及CNN
在上节中,我们已经详细介绍了WISDM数据集及如何使用CNN网络训练,得到了六个维度的模型仿真指标及五个维度的可视化分析,那么现在我们将训练模型推广到其他网路结构中去,通过仿真实验来对比一下不同网络之间对于WISDM数据集的训练效…...
【蚂蚁HR-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
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 …...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
