《OpenCV 计算机视觉》—— 视频背景建模

news/2024/10/9 2:03:02/

文章目录

    • 一、背景建模的目的
    • 二、背景建模的方法
    • 三、背景建模的步骤
    • 四、注意事项
    • 五、代码实现

一、背景建模的目的

视频背景建模的主要目的是从视频序列中提取出静态背景,以便将动态的前景对象与静态的背景进行分离。这有助于进一步分析和处理视频内容,如进行运动检测、场景理解和事件检测等。

二、背景建模的方法

在OpenCV中,有多种方法可以实现视频背景建模,其中常用的方法包括混合高斯模型(MOG)和K最近邻(KNN)算法。

  1. 混合高斯模型(MOG)

    • 原理:混合高斯模型认为每个像素点的颜色值分布可以表示为多个高斯分布的混合。在背景建模过程中,会对每个像素点建立多个高斯分布,并根据新的像素值不断更新这些分布的参数。当新的像素值到来时,会将其与已有的高斯分布进行匹配,如果匹配成功则认为是背景,否则认为是前景。
    • 实现:在OpenCV中,可以使用createBackgroundSubtractorMOG2()函数来创建混合高斯模型背景减除器。该函数接受一些参数,如用于训练背景的帧数(history)、方差阈值(varThreshold)和是否检测影子(detectShadows)等。创建好背景减除器后,可以使用其apply()方法对视频帧进行处理,得到前景掩码。
  2. K最近邻(KNN)算法

    • 原理:KNN算法是一种基于实例的学习方法,它通过测量不同特征值之间的距离进行分类。在背景建模中,KNN算法可以用于对每个像素点进行分类,判断其属于背景还是前景。
    • 实现:在OpenCV中,可以使用createBackgroundSubtractorKNN()函数来创建KNN背景减除器。该函数同样接受一些参数,如用于训练背景的帧数(history)、距离阈值(dist2Threshold)和是否检测影子(detectShadows)等。创建好背景减除器后,同样可以使用其apply()方法对视频帧进行处理。

三、背景建模的步骤

使用OpenCV进行视频背景建模的步骤通常包括以下几个:

  1. 读取视频:使用VideoCapture类读取视频文件或摄像头捕获的视频流。
  2. 创建背景减除器:根据需求选择混合高斯模型或KNN算法,并创建相应的背景减除器。
  3. 处理视频帧:遍历视频的每一帧,使用背景减除器的apply()方法对每一帧进行处理,得到前景掩码。
  4. 后处理:对前景掩码进行形态学处理(如腐蚀、膨胀、开运算、闭运算等)以去除噪点或填充空洞。
  5. 显示结果:将处理后的前景掩码或叠加在原始视频帧上的结果进行显示。

四、注意事项

  1. 参数选择:在选择背景建模方法时,需要根据具体场景和需求选择合适的参数。例如,在光照变化明显的场景中,可能需要调整方差阈值或距离阈值以提高模型的鲁棒性。
  2. 实时性:背景建模算法需要能够处理实时视频流,并在短时间内给出结果。因此,在选择算法时需要考虑其计算复杂度和处理速度。
  3. 模型更新:背景模型需要随着视频帧的更新而不断更新,以适应场景的变化。在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/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
    
  • 结果如下:
    在这里插入图片描述


http://www.ppmy.cn/news/1536412.html

相关文章

java8 双冒号(::)使用方法

双冒号(::)运算符是跟函数式接口相关的运算符,作为函数式接口的赋值操作。 双冒号用于静态方法 使用方法:将类的静态方法赋值给一个函数式接口,静态方法的参数个数、类型要跟函数式的接口一致。调用这个函数式接口就…

202408第十五届蓝桥杯青少组省赛C++中级组题解

202408第十五届蓝桥杯青少组省赛C++中级组题解 单选题 1、定义 char a[]="hello\nworld",执行 cout<<a,输出结果是(B) A、helloworld B、hello world C、 hellonworld D、 hello\nworld 解析:\n输出时会换行。 2、 的结果是(C)。 A、 B、

滚雪球学Oracle[4.2讲]:PL/SQL基础语法

全文目录&#xff1a; 前言一、PL/SQL基础语法1.1 变量声明变量声明示例&#xff1a; 二、记录类型与集合类型的使用2.1 记录类型记录类型的定义与使用 2.2 集合类型 三、PL/SQL表与关联数组3.1 PL/SQL表&#xff08;嵌套表&#xff09;嵌套表的定义与使用 3.2 关联数组关联数组…

数据挖掘笔记part one (认识数据挖掘)

定义 从大量的&#xff0c;不完全的&#xff0c;有噪音的&#xff0c;模糊的&#xff0c;随机的数据中提取出存在潜在价值信息和知识的过程。 数据&#xff0c;信息&#xff0c;知识的关系 数据>信息>情报>知识>智慧&#xff08;越小越精炼&#xff0c;越牛&…

Leetcode 10. 正则表达式匹配

1.题目基本信息 1.1.题目描述 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s 的&#xff0c;而不是部分…

深入解析 NoSQL 数据库的分类与特点

目录 NoSQL 数据库概述NoSQL 数据库的主要分类 2.1 键值存储2.2 文档存储2.3 列族存储2.4 图数据库 NoSQL 数据库的特点NoSQL 数据库的应用场景NoSQL 数据库的优缺点总结 NoSQL 数据库概述 NoSQL 数据库是一种非关系型数据库&#xff0c;旨在应对大规模数据存储和处理的挑战…

02_InFluxDb

InFluxDb 初始化初始化流程 交互InFluxDbWebUI交互 数据模型行协议添加标签数据格式 数据类型空格索引 初始化 初始化流程 用户 密码 组织名称 Bucket—mysql里面的数据库概念 交互InFluxDb 暂用了8086端口.提供了 http api WebUI交互 略... 数据模型 这是mysql里面的表…

Semantic Communications With AI Tasks——面向图像分类任务的语义传输系统

论文链接&#xff1a; 2109.14170 (arxiv.org)https://arxiv.org/pdf/2109.14170 1. 背景 无线网络从“万物互联”向“智能互联”转变的范式变化&#xff0c;这与香农和韦弗关于通信演变的预言相一致。传统的无线网络侧重于信号的准确传输&#xff08;技术层面&#xff09;&…