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

文章目录

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

一、背景建模的目的

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

二、背景建模的方法

在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.mzph.cn/web/54374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Mybatis篇】Mybatis的关联映射详细代码带练 (多对多查询、Mybatis缓存机制)

🧸安清h:个人主页 🎥个人专栏:【计算机网络】,【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯一.关联映射概述 &#x1f6a…

RTSP协议讲解

1.RTSP协议 rtsp,英文全称 Real Time Streaming Protocol,RFC2326,实时流传输协议,是 TCP/IP 协议体系中的一个应用层协议。 RTSP 交互流程 1)OPTIONS C--->S 客户端向服务器端发现 OPTIONS,请求可用…

html中的文本标签(含标签的实现案例)

目录 1.标题标签 2.标题标签的align属性 3.段落标签 4.水平线标签hr 5.换行标签br 6.文本样式标签font ​编辑7.文本格式化标签 8.文本语义标签 1)时间time标签 2)文本高亮Mark标签 3)cite标签 9.特殊字符标签 10.图像标签img 附录&#xff…

408算法题leetcode--第24天

#378. 有序矩阵中第 K 小的元素 378. 有序矩阵中第 K 小的元素思路&#xff1a;值二分&#xff0c;如注释时间&#xff1a;O(log(r-l) * n)&#xff1b;空间&#xff1a;O(1) class Solution { public:int check(vector<vector<int>>& matrix, int target){/…

Spring Boot中获取application.yml中属性的几种方式

在Spring Boot应用程序中&#xff0c;可以通过多种方式从application.yml文件中获取配置属性。以下是几种常见的方法&#xff1a; 1. 使用Value注解 你可以使用Value注解将application.yml中的属性注入到Spring管理的bean中。 application.yml app:name: MySpringBootAppve…

基于微信小程序的旅游拼团系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

gitee公钥设置、创建库及使用

简介 一、如何安装git 使用gitee&#xff0c;需要先安装git工具。 工具网站地址&#xff1a;https://git-scm.com/downloads 安装完成后&#xff0c;在terminal命令行输入git --version可以查看到git的版本。 二、登录gitee 我们先在 gitee上注册账号并登录。gitee官网&#x…

震动传感器介绍及实战

目录 前言 震动传感器 1.震动传感器配图 2.震动传感器原理图 3.震动传感器使用 1-震动传感器的意义 2-震动传感器的应用场景 3- SW-18010P震动传感器使用方法 震动传感器控制灯 操作 增加延时 使用SPC-ISP生成演示函数 总结 前言 我们上节已经简单了解了LED的使用…

二、变量与基本类型

变量与基本类型 变量定义声明和使用 基本类型数字类型介绍运算算术运算符位运算符赋值运算符运算符优先级 布尔类型字符类型字符串类型 变量 定义 变量&#xff0c;指值可以变的量。变量以非数字的符号来表达&#xff0c;一般用拉丁字母。变量的用处在于能一般化描述指令的方式…

MongoDB集群模式详解及应用实战

目录 本节课内容&#xff1a; 集群搭建 1.创建3个目录&#xff1a; 2.编辑配置文件 ​编辑 3.启动&#xff1a; 4.看看&#xff1a; 5.另外&#xff0c;两个如上1&#xff0c;2&#xff0c;3步骤操作 &#xff0c;但是日志目录&#xff0c;端口什么的需要改一下即可。 …

10以内数的分解

// 10以内数的分解.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> using namespace std; int main(int argc, char* argv[]){for (int i 2; i < 10; i){for (int j 1; j < i; j){printf("%d%d%d ",j…

操作系统学习笔记---文件管理

文件系统基础 概念 文件&#xff1a;以计算机硬盘为载体的存储在计算机上的信息集合 文件的属性 文件具有一定的属性&#xff0c;系统不同&#xff0c;属性也会有所不同&#xff0c;但通第都包括如下属性&#xff1a;名称、标识符、类型、位置、大小、保护、时间、日期和用…

C# Windows 窗体开发基础

Windows Forms&#xff08;WinForms&#xff09;是 C# 中用于开发桌面应用程序的框架。它提供了丰富的 UI 控件&#xff0c;可以快速构建桌面应用程序的用户界面。本文将介绍 Windows 窗体开发的基本概念&#xff0c;包括窗体和控件、事件处理、界面布局与设计&#xff0c;以及…

vue3+vite@4+ts+elementplus创建项目详解

1、第一步创建项目cnpm init vite4 2、设置vue3.2局域网可访问配置&#xff1a; 找到项目路径下的package.json目录下找到script对象下面添加一下代码&#xff1a; "serve": "vite --host 0.0.0.0" 启动项目命令不在是dev而是&#xff1a;cnpm run serve 3…

《深度学习》OpenCV 摄像头OCR 过程及案例解析

目录 一、摄像头OCR 1、含义 2、一般操作步骤 1&#xff09;安装OpenCV库 2&#xff09;设置摄像头 3&#xff09;图像采集 4&#xff09;图像预处理 5&#xff09;文本识别 6&#xff09;文本处理 7&#xff09;结果显示 二、案例实现 1、定义展示图像函数 2、定…

《C++20:编程世界的新变革与应用场景探索》

C 作为一种广泛应用的编程语言&#xff0c;一直在不断演进和发展。C20 的到来为开发者带来了众多令人兴奋的新特性&#xff0c;这些特性不仅提升了 C 的编程效率、代码可读性和可维护性&#xff0c;还为各种应用场景带来了新的解决方案。在本文中&#xff0c;我们将深入探讨 C2…

Java - LeetCode面试经典150题 - 哈希表 (二)

哈希表 383. 赎金信 题目 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 提示…

深入理解 JavaScript 事件循环机制:单线程中的异步处理核心

深入理解 JavaScript 事件循环机制&#xff1a;单线程中的异步处理核心 JavaScript 是一门单线程的编程语言&#xff0c;也就是说它在同一时间只能执行一个任务。然而&#xff0c;现代 Web 应用经常需要处理大量的异步操作&#xff0c;如用户输入、网络请求、定时器等。为了确…

[CSP-J 2021] 插入排序

[CSP-J 2021] 插入排序 题目描述 插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生&#xff0c;今天 H 老师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 O ( 1 ) \mathcal O(1) O(1)&#xff0c;则插入排序可以以 O ( n 2 ) \mathcal O(…

《迁移学习》—— 将 ResNet18 模型迁移到食物分类项目中

文章目录 一、迁移学习的简单介绍1.迁移学习是什么&#xff1f;2.迁移学习的步骤 二、数据集介绍三、代码实现1. 步骤2.所用到方法介绍的文章链接3. 完整代码 一、迁移学习的简单介绍 1.迁移学习是什么&#xff1f; 迁移学习是指利用已经训练好的模型&#xff0c;在新的任务上…