高亮动态物体——前景提取与动态物体检测器(opencv实现)

embedded/2025/3/18 12:00:03/

目录

代码说明

1. 导入库

2. 创建背景建模对象

3. 打开视频源

4. 逐帧处理视频

5. 应用背景建模获得前景掩码

6. 形态学操作去除噪声

6.1 定义形态学核

6.2 开运算去除噪点

6.3 膨胀操作填补前景区域空洞

7. 轮廓检测识别动态物体

8. 绘制轮廓和边界框

9. 显示处理结果

10. 退出控制与资源释放

整体代码

效果展示



代码说明

主要功能是通过背景建模检测视频中的运动目标。其工作流程如下:

  1. 读取视频帧;
  2. 利用 MOG2 算法生成前景掩码;
  3. 通过形态学操作(开运算和膨胀)对掩码进行噪声去除和平滑处理;
  4. 检测前景中的轮廓,并过滤掉小的噪声区域;
  5. 在原始帧上绘制出运动目标的轮廓和边界框;
  6. 显示处理后的结果。

具体来说可以应用于安防监控、运动检测、交通监控等领域,在背景相对稳定的场景中表现较好(一定要稳定,不然容易将背景也识别进去)。


1. 导入库

import cv2 import numpy as np
  • cv2:这是 OpenCV 库,用于计算机视觉相关操作,如图像处理、视频读取、背景建模、形态学操作和轮廓检测等。
  • numpy:用于数值计算,特别是对图像数组的操作。

2. 创建背景建模对象

backSub = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True)
  • cv2.createBackgroundSubtractorMOG2:使用高斯混合模型(MOG2)创建一个背景减除器,可以对视频进行背景建模。
  • 参数说明
    • history=500:指定模型用于背景建模的历史帧数,越大的值适应慢的场景变化。
    • varThreshold=16:设定阈值,用于判断当前像素是否为前景,值越小敏感度越高。
    • detectShadows=True:启用阴影检测,可以将阴影区域也标记出来(通常阴影会以灰色显示)。

3. 打开视频源

cap = cv2.VideoCapture('video.mp4')
  • 使用 cv2.VideoCapture 打开视频文件。
  • 参数 'video.mp4' 表示视频文件名,若要使用摄像头,则传入参数 0(或其它对应摄像头的编号)。

4. 逐帧处理视频

while True: ret, frame = cap.read() if not ret: break
  • cap.read():从视频中读取一帧。
    • ret 表示是否读取成功;
    • frame 为当前帧的图像数据。
  • 当读取失败(如视频结束)时,跳出循环。

5. 应用背景建模获得前景掩码

fgMask = backSub.apply(frame)
  • 对每一帧应用背景建模算法,得到一个前景掩码 fgMask
  • 在该掩码中,前景(运动目标)通常为白色,而背景为黑色(或者带有阴影区域的灰色)。

6. 形态学操作去除噪声

6.1 定义形态学核
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
  • 这里使用一个椭圆形的核(大小为 3x3),适用于后续的腐蚀、膨胀和开运算等操作。
6.2 开运算去除噪点
fgMask = cv2.morphologyEx(fgMask, cv2.MORPH_OPEN, kernel, iterations=1)
  • 开运算(先腐蚀后膨胀)用于消除小的噪声点,使前景区域更加平滑。
6.3 膨胀操作填补前景区域空洞
fgMask = cv2.dilate(fgMask, kernel, iterations=2)
  • 膨胀可以使前景区域中的小空洞被填补,进一步增强目标区域的完整性。

7. 轮廓检测识别动态物体

contours, hierarchy = cv2.findContours(fgMask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  • cv2.findContours:在前景掩码中查找轮廓。
  • 参数说明:
    • cv2.RETR_EXTERNAL 表示只检测外部轮廓;
    • cv2.CHAIN_APPROX_SIMPLE 对轮廓点进行简单压缩,只保留必要的端点,从而节省内存。

8. 绘制轮廓和边界框

for cnt in contours: area = cv2.contourArea(cnt) if area > 500: cv2.drawContours(frame, [cnt], -1, (0, 0, 255), 2) x, y, w, h = cv2.boundingRect(cnt) cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
  • 遍历所有检测到的轮廓
    • cv2.contourArea(cnt) 计算轮廓的面积。
    • 过滤掉面积小于 500 的轮廓(通常为噪声)。
  • 绘制轮廓
    • 使用 cv2.drawContours 将符合条件的轮廓用红色(BGR 中(0, 0, 255))绘制在原始帧上。
  • 绘制边界框
    • 使用 cv2.boundingRect 得到轮廓的最小外接矩形;
    • cv2.rectangle 在图像上绘制绿色((0, 255, 0))矩形框,用以标识动态物体的位置。

9. 显示处理结果

cv2.imshow('原始帧', frame) cv2.imshow('前景掩码', fgMask)
  • 分别显示绘制了轮廓和边界框的原始视频帧以及经过形态学处理后的前景掩码。

10. 退出控制与资源释放

if cv2.waitKey(30) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
  • cv2.waitKey(30):等待 30 毫秒,同时捕捉键盘输入。按下 q 键时,退出循环。
  • 循环结束后,释放视频资源并关闭所有 OpenCV 窗口。


整体代码

import cv2
import numpy as np# 创建背景建模对象,使用高斯混合模型
backSub = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True)# 打开视频文件,或者使用摄像头(参数0代表摄像头)
cap = cv2.VideoCapture('video.mp4')  # 请将'video.mp4'替换成你的文件路径,或使用0打开摄像头while True:ret, frame = cap.read()if not ret:break# 应用背景建模,获得前景掩码fgMask = backSub.apply(frame)# 形态学操作:先用开运算去除噪声(先腐蚀后膨胀)kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))fgMask = cv2.morphologyEx(fgMask, cv2.MORPH_OPEN, kernel, iterations=1)# 膨胀操作:填补前景区域中的小空洞,使目标区域更加完整fgMask = cv2.dilate(fgMask, kernel, iterations=2)# 使用轮廓检测识别动态物体contours, hierarchy = cv2.findContours(fgMask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 在原始帧上绘制轮廓和边界框for cnt in contours:area = cv2.contourArea(cnt)# 过滤掉较小的噪点if area > 500:# 绘制轮廓(红色)cv2.drawContours(frame, [cnt], -1, (0, 0, 255), 2)# 计算边界框并绘制(绿色)x, y, w, h = cv2.boundingRect(cnt)cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示结果cv2.imshow('原始帧', frame)cv2.imshow('前景掩码', fgMask)# 按 'q' 键退出循环if cv2.waitKey(30) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

效果展示

人物高亮显示效果展示

人物高亮之隐身


http://www.ppmy.cn/embedded/173587.html

相关文章

Spring Boot 的自动装配

Spring Boot 的自动装配(Auto Configuration)是其核心特性之一,通过智能化的条件判断和配置加载机制,极大简化了传统 Spring 应用的配置复杂度。其原理和实现过程可概括为以下几个关键点: 一、核心触发机制&#xff1a…

HarmonyOS第26天:应用发布与推广全攻略:从0到1走向市场

一、引言:开启 HarmonyOS 应用之旅 在数字化时代的浪潮中,HarmonyOS 以其独特的分布式理念和强大的跨设备协同能力,为应用开发领域开辟了一片崭新的天地。随着 HarmonyOS 市场份额的稳步增长,其生态设备数量已突破 9 亿大关,吸引了超过 254 万开发者投身其中 ,成为了开发…

【操作系统安全】任务6:Linux 系统文件与文件系统安全 学习指南

目录 一、文件系统基础概念 二、查看文件系统信息 2.1 磁盘空间查看 2.2 分区与挂载管理 2.3 文件系统类型操作 三、文件系统权限配置 3.1 基础权限管理 3.2 所有权管理 3.3 特殊权限设置 四、文件操作基础 4.1 文件创建 4.2 文件删除 4.3 文件复制与移动 4.4 文件…

Python游戏开发自学指南:从入门到实践(第四天)

Python不仅适用于数据分析、Web开发和自动化脚本,还可以用于游戏开发!虽然Python不是传统意义上的游戏开发语言,但其简洁的语法和丰富的库使其成为初学者学习游戏开发的绝佳选择。本文将为你提供一份全面的Python游戏开发自学指南&#xff0c…

dify数据库的操作方式二

dify数据库的操作方式 基础环境安装修改sanbox增加以来代码执行执行 基础环境安装 基础环境安装 修改sanbox增加以来 # 在线方式 # 修改volumes/sandbox/dependencies/python-requirements.txt mysql-connector-python# 离线方式 # 下载https://mirrors.aliyun.com/pypi/pac…

嵌入式Linux | 什么是 BootLoader、Linux 内核(kernel)、和文件系统?

01 什么是 BootLoader 呢? 它是个引导程序,也就是硬件复位以后第一个要执行的程序,它主要工作就是初始化操作系统运行的环境,比如说内存、定时器、缓冲器等,当这个工作做完以后,再把操作系统的代码加载…

使用 .NET Core 实现 RabbitMQ 消息队列的详细教程

RabbitMQ 是一个流行的消息队列中间件,它允许应用程序通过异步消息的方式进行通信。RabbitMQ 支持 AMQP 协议,可以通过多种方式与应用程序交互。在本教程中,我们将深入探讨如何在 .NET Core 环境中使用 RabbitMQ 来实现消息队列。我们将学习如…

Mysql的库操作

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 1. 简单数据库操作 1.1 查看数据库 1.2 创建数据库 1.3 使用数据库 …