使用OpenCV实现视频背景减除与目标检测

devtools/2024/11/28 18:15:12/
摘要

背景减除是计算机视觉中一种常用的技术,用于从视频流中分离前景对象。本文将介绍如何利用OpenCV库实现视频背景减除,并进一步通过形态学操作和轮廓检测来识别视频中的运动物体。通过一个具体的代码示例,我们将逐步演示整个流程。

1. 引言

背景减除是一种基于像素级别的方法,用于区分视频中的静态背景和动态前景。在监控、人机交互等领域有着广泛的应用。OpenCV 提供了强大的工具来支持这一过程,包括混合高斯模型(MOG2)背景减除器、形态学操作等。

2. 环境准备

在开始之前,请确保已经安装了 OpenCV 库。如果没有安装,可以通过以下命令安装:

pip install opencv-python
pip install opencv-contrib-python
3. 代码实现
3.1 导入必要的库
import cv2
3.2 读取视频文件
cap = cv2.VideoCapture(r'picture_video\test.avi')
3.3 创建卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
3.4 创建混合高斯模型背景减除器
fgbg = cv2.createBackgroundSubtractorMOG2()
3.5 处理视频流
while True:ret, frame = cap.read()  # 读取视频帧if not ret:breakcv2.imshow('frame', frame)fgmask = fgbg.apply(frame)  # 背景减除cv2.imshow('fgmask', fgmask)fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)  # 形态学开运算cv2.imshow('fgmask1', fgmask_new)# 寻找视频中的轮廓contours, _ = 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)  # 获取轮廓的边界框cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 在原帧上绘制矩形框cv2.imshow('fgmask_new_rect', frame)k = cv2.waitKey(60)if k == 27:  # 按ESC键退出breakcap.release()
cv2.destroyAllWindows()
4. 代码解析
  1. 读取视频文件:使用 cv2.VideoCapture 读取视频文件。
  2. 创建卷积核:使用 cv2.getStructuringElement 创建一个十字形的卷积核,用于后续的形态学操作。
  3. 创建混合高斯模型背景减除器:使用 cv2.createBackgroundSubtractorMOG2 创建一个混合高斯模型背景减除器。
  4. 处理视频流
    • 读取每一帧视频。
    • 应用背景减除器,生成前景掩码。
    • 对前景掩码进行形态学开运算,去除噪声。
    • 使用 cv2.findContours 查找轮廓。
    • 计算每个轮廓的周长,筛选出较大的轮廓。
    • 在原帧上绘制矩形框,标记出运动物体。
    • 显示处理结果,按ESC键退出。
5. 结果展示

通过上述步骤,我们可以成功地从视频中分离出前景物体,并在视频中绘制出运动物体的边界框。最终的处理结果如下所示:

6. 总结

本文详细介绍了如何使用 OpenCV 实现视频背景减除与目标检测,包括读取视频文件、创建卷积核、背景减除、形态学操作、轮廓检测等关键步骤。通过一个实际的代码示例,展示了如何从视频中分离出前景物体并进行标记。希望本文能为读者在计算机视觉领域的学习和研究提供帮助。


http://www.ppmy.cn/devtools/137729.html

相关文章

利用爬虫爬取网页小说

需求分析 安装requests包 pip install requests目录采集地址: h t t p s : / / w w w . 3 b q g . c c / b o o k / 60417 / https://www.3bqg.cc/book/60417/ https://www.3bqg.cc/book/60417/ 章节采集地址: h t t p s : / / w w w . 3 b q g . c …

详细描述一下Elasticsearch更新和删除文档的过程?

大家好,我是锋哥。今天分享关于【详细描述一下Elasticsearch更新和删除文档的过程?】面试题。希望对大家有帮助; 详细描述一下Elasticsearch更新和删除文档的过程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 E…

C++-qt经验

qt下载安装 【保姆级图文教程】QT下载、安装、入门、配置VS Qt环境-CSDN博客 qt项目打包成软件 QT项目打包成软件进行发布的三种方式_qt打包-CSDN博客

生产环境中,nginx 最多可以代理多少台服务器,这个应该考虑哪些参数 ?怎么计算呢

生产环境中,nginx 最多可以代理多少台服务器,这个应该考虑哪些参数 ?怎么计算呢 关键参数计算方法评估步骤总结 在生产环境中,Nginx最多可以代理的服务器数量并没有一个固定的限制,它取决于多个因素,包括Ng…

Oracle-decode和case when的用法

-- case when 通用 功能比decode强大多了 -- decode 可以实现的 CASE WHEN都可以实现 -- decode 针对一个字段的值去判断 SELECT e.* ,DECODE(e.job, SALESMAN,销售员, PRESIDENT,董事长 ,分析师; --剩下的都是分析师 如果是确定的不建议这么写 ) AS new_job FROM em…

英语知识在线平台:Spring Boot技术应用

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

(笔记)简单了解ZYNQ

1、zynq首先是一个片上操作系统(Soc),结合了arm(PS)和fpga(PL)两部分组成 Zynq系统主要由两部分组成:PS(Processing System)和PL(Programmable L…

【人工智能】使用Python实现序列到序列(Seq2Seq)模型进行机器翻译

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 序列到序列(Sequence-to-Sequence, Seq2Seq)模型是解决序列输入到序列输出任务的核心架构,广泛应用于机器翻译、文本摘要和问答系统等自然语言处理任务中。本篇文章深入介绍 Seq2Seq 模型的原理及其核心组件(…