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

《深度学习》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&#xff0c;k&#xff1b;map是k&#xff0c;v&#xff09;&#xff0c;现在直接用T代替 template<class T> //这里直接传了T作为模板参数&#xff0c;T可能是pai…...

【C++】多态(下)

个人主页~ 多态&#xff08;上&#xff09;~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…...

基于四种网络结构的WISDM数据集仿真及对比:Resnet、LSTM、Shufflenet及CNN

在上节中&#xff0c;我们已经详细介绍了WISDM数据集及如何使用CNN网络训练&#xff0c;得到了六个维度的模型仿真指标及五个维度的可视化分析&#xff0c;那么现在我们将训练模型推广到其他网路结构中去&#xff0c;通过仿真实验来对比一下不同网络之间对于WISDM数据集的训练效…...

【蚂蚁HR-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...