首页 > 其他分享 >《深度学习》OpenCV 背景建模 原理及案例解析

《深度学习》OpenCV 背景建模 原理及案例解析

时间:2024-10-04 21:18:20浏览次数:9  
标签:背景 cv2 建模 像素 fgmask 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 

标签:背景,cv2,建模,像素,fgmask,OpenCV,图像,解析
From: https://blog.csdn.net/qq_64603703/article/details/142678511

相关文章

  • 《深度学习》OpenCV 指纹验证、识别
    目录一、指纹验证1、什么是指纹验证2、步骤1)图像采集2)图像预处理3)特征提取4)特征匹配5)相似度比较6)结果输出二、案例实现1、完整代码2、实现结果调试模式:三、指纹识别案例1、展示指纹库图片2、待验证指纹图3、看完整代码运行结果:一、指纹验证1、什么是指纹......
  • BUUCTF_MISC题解析(3,4)
    3.你竟然赶我走搜索010editor官网,点第一个页面,下载010editor(十六进制编译器)(黄色图标),直接010editor打开(或者使用stegSolve)一般情况用ctrl+f进入字符串搜索查看是否有插入的flag信息,就可以在文件尾看到flag是flag{stego_is_s0_bor1ing} 4.二维码扫码识别二维码,发现隐......
  • 数学建模与数学实验课后习题答案 3.4.8 matlab实现
    完成日期2024年10月1题目8.已知某工厂计划生产1,2,3三种产品,各产品需要在ABC设备加工。有关数据如下:1 2 3 每月设备有效台时A 8 2 10 300B 10 5 8 400C 2 13 10 420单位产品利润/千元 3 2 2.9(1).如何发挥生产能力,使生产盈利最大?(2).若为增加产量,可借用设......
  • 扩散引导语言建模(DGLM):一种可控且高效的AI对齐方法
    随着大型语言模型(LLMs)的迅速普及,如何有效地引导它们生成安全、适合特定应用和目标受众的内容成为一个关键挑战。例如,我们可能希望语言模型在与幼儿园孩子互动时使用不同的语言,或在撰写喜剧小品、提供法律支持或总结新闻文章时采用不同的风格。目前,最成功的LLM范式是训练一......
  • 自然语言处理之话题建模:Neural Topic Models:神经主题模型的未来趋势与研究方向_
    自然语言处理之话题建模:NeuralTopicModels:神经主题模型的未来趋势与研究方向引言话题建模的定义与重要性话题建模是一种统计建模技术,用于发现文档集合或语料库中隐藏的主题结构。在自然语言处理(NLP)领域,话题建模被广泛应用于文本挖掘、信息检索、文本分类和推荐系统等......
  • 数据解析的三种方式
    数据解析的三种方式数据解析的原理解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储1.进行指定标签的定位2.标签或者标签对应的数据中存储的数据值进行提取1.正则url请求方式反反爬策略编写响应的正则进行访问2.bs4解析原理:实例化一个Beauti......
  • “订单、账单、支付单”关系解析
    当交易、支付等体系糅合在一起时,可能会产生许多单据或单号,这个时候,要怎么理解单据在交易正、逆向中的联系?这篇文章里,作者结合设定场景做了解读,或许可以帮你理解“订单、账单、支付单”关系。有朋友提出一个问题比较典型,可能是很多朋友的疑问点:整个交易、支付、清结算、账务......
  • 03 掌握Docker核心架构:镜像、仓库、容器及运行管理的深度解析
    文章目录03掌握Docker核心架构:镜像、仓库、容器及运行管理的深度解析一概述1.1镜像1.2镜像仓库1.3容器二、镜像及镜像仓库2.1本地镜像仓库2.2镜像仓库简介2.3使用远端仓库2.3.1从远端镜像仓库拉取apache镜像2.3.2从远端镜像仓库拉取指定......
  • 在树莓派上安装c++版本的opencv并运行
     这里默认你用的是树莓派的镜像(因为ubantu对树莓派的性能占用有点大)树莓派安装使用opencvc++版本首先我们安装依赖sudoapt-getinstallbuild-essentialsudoapt-getinstallcmakelibgtk2.0-devpkg-configlibswscale-devsudoapt-getinstalllibjpeg-devlibpng......
  • 分别使用OVP-UVP和OFP-UFP算法以及AFD检测算法实现反孤岛检测simulink建模与仿真
    1.课题概述分别使用OVP-UVP和OFP-UFP算法以及AFD检测算法实现反孤岛检测simulink建模与仿真。 2.系统仿真结果  3.核心程序与模型版本:MATLAB2013b   functionsys=mdlOutputs(t,x,u)%定义全局变量globalf_i;globalf_vo;globalf_v_hb......