《深度学习》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-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...