计算机视觉基础 第13章 |背景建模与运动目标检测

目录

前言

一、实验需求

二、实验原理分析

[2.1 MOG2(高斯混合模型背景减除)](#2.1 MOG2(高斯混合模型背景减除))

[2.2 形态学开运算](#2.2 形态学开运算)

三、完整代码实现

四、实验结果与分析

五、本章小结


前言

在视频监控场景中,经常需要把运动的前景物体(行人、车辆)和静止背景分离开,实现运动目标提取。背景建模就是构建出视频背景图像,通过对比当前帧与背景,得到运动前景掩码。本章使用MOG2 高斯混合背景减除算法完成视频运动目标检测,结合形态学操作去除掩码噪声,轮廓检测框选出运动物体。

一、实验需求

读取视频文件,有目标运动的视频即可,使用背景建模算法分离背景与运动前景;通过形态学运算消除前景掩码中的噪点;查找轮廓,依据轮廓周长过滤小噪点目标,对有效运动物体绘制矩形框,实现视频运动物体检测。

二、实验原理分析

2.1 MOG2(高斯混合模型背景减除)

cv2.createBackgroundSubtractorMOG2()是基于高斯混合模型的背景建模算法。

  • 算法会统计视频图像每个像素点一段时间内的像素值分布,建立多个高斯分布模型,区分背景像素与前景像素,长时间像素值不变的为背景像素,突然改变的为前景像素。
  • apply(frame)输入当前帧图像,输出前景掩码 fgmask :运动前景像素为白色255,背景像素为黑色0,输出第一帧的掩码图是大量的白色噪声点,因为没有前一帧作为比较。
  • getBackgroundImage()可以获取算法学习得到的背景图像。

2.2 形态学开运算

缺点:MOG2算法基于单像素点进行前景、背景判定,对环境干扰较为敏感。视频中的光照波动、树叶轻微晃动等微小动态变化,都会被算法误识别为运动前景,使原始掩码产生大量椒盐噪声,出现零散的白色噪点,因此需要结合形态学操作完成降噪优化。

python 复制代码
kernel = cv2.getStructuringElement(cv2.MORPH_CLOSE,(3,3))
fgmask_new = cv2.morphologyEx(fgmask,cv2.MORPH_OPEN,kernel)

开运算 = 先腐蚀、后膨胀

作用:消除掩码中小面积白色噪点,断开细小的连通区域;同时尽量保留较大运动目标物体轮廓。

2.3 轮廓查找与目标筛选

经过形态学去噪处理后,视频每一帧均可得到干净、有效的二值掩码图像。基于二值图像的明暗分割特性,可精准提取运动目标的轮廓信息,通过求取轮廓外接矩形的方式锁定目标范围,最终实现视频中运动物体的识别与定位。

  1. cv2.findContours()在处理后的二值掩码上查找外部轮廓。
  2. cv2.arcLength(c,True)计算轮廓周长;设置阈值perimeter>188,过滤掉面积很小的噪声轮廓。
  3. cv2.boundingRect(c)求取轮廓外接矩形坐标(x,y,w,h)。
  4. cv2.rectangle()在原始视频帧上绘制绿色矩形框,标记运动目标。

三、完整代码实现

python 复制代码
import cv2
读取视频
cap = cv2.VideoCapture(r"D:\pythoncode2\bigdata_ai40\data\test.avi")
卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_CLOSE,(3,3))
创建MOG2高斯混合背景减除器
MOG2:高斯混合模型背景减除算法,分离运动前景与静止背景,输出二值掩码
fgbg = cv2.createBackgroundSubtractorMOG2()
while True:
ret, frame = cap.read()
if not ret:   # 读取到视频末尾,退出循环
break
cv2.imshow("frame", frame)
# 应用背景减除,得到前景掩码
fgmask = fgbg.apply(frame)
cv2.imshow("fgmask", fgmask)
获取算法学习得到的背景图像
bg_img = fgbg.getBackgroundImage()
cv2.imshow("background", bg_img)
形态学开运算:腐蚀再膨胀,去除掩码离散小白噪声点
fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
cv2.imshow("fgmask_new", fgmask_new)
查找外部轮廓
contours = cv2.findContours(fgmask_new,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]
fgmask_new_rect = frame.copy()  # 在副本上画框,避免修改原图
for c in contours:
perimeter = cv2.arcLength(c, True)
# 根据轮廓周长过滤过小噪声轮廓
if perimeter > 188:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(fgmask_new_rect,(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
cap.release()
cv2.destroyAllWindows()

四、实验结果与分析

运行上述代码,程序会依次弹出多个窗口,分别展示原始视频帧、前景掩码、背景图像、形态学处理后的掩码以及最终绘制矩形框的检测结果。通过观察可以发现,原始前景掩码中存在大量零散的白色噪点,经过形态学开运算处理后,掩码中的椒盐噪声被有效去除,运动目标区域更加完整、干净。

在最终检测结果窗口中,视频中的运动物体被绿色矩形框准确框选。当画面中存在行人或车辆等运动目标时,矩形框能够跟随目标移动并保持稳定;当画面中只有静止背景时,不会出现误检框。实验结果表明,基于 MOG2 背景建模结合形态学降噪与轮廓筛选的方案,能够有效完成视频运动目标检测任务。

五、本章小结

本章实验完成了基于背景建模的视频运动目标检测完整流程,整体技术链路清晰完整:读取视频时序帧 → MOG2高斯混合算法迭代构建背景模型、生成前景二值掩码 → 提取纯净场景背景图像 → 形态学开运算剔除掩码椒盐噪声 → 提取前景目标轮廓 → 基于轮廓周长阈值筛选有效目标 → 绘制外接矩形框可视化标记运动物体。

MOG2高斯混合背景减除算法适配常规静态监控场景,具备自适应轻微场景扰动、实时迭代更新背景模型的优势,实用性较强。但该算法存在固有缺陷,对光照突变、目标阴影、微小场景晃动等干扰因素敏感度较高,易产生误检测,必须搭配形态学降噪、轮廓阈值筛选等后处理手段优化检测精度,提升检测效果。

为进一步提升复杂场景中运动目标检测的稳定性与检测精度,后续自行尝试KNN背景减除算法、GMG背景建模算法等主流背景建模方案,通过多算法对比实验,分析各类算法的优缺点与场景适配能力,择优选用最优检测方案。

相关推荐
卷无止境13 分钟前
SIE:当一个推理引擎决定把100多个模型装进一个集群里
人工智能·python
阳明山水16 分钟前
概念漂移分类与自适应策略解析
人工智能·深度学习·算法·机器学习·架构
狂师17 分钟前
AI 测试提效 | 别搞万能 Skill,推荐5 个 Agent Skill 串起 UI 自动化执行到报告生成全流程
人工智能·agent·测试
动物园猫19 分钟前
超市空货架目标检测数据集:1,500张图像 | 目标检测
人工智能·目标检测·计算机视觉
卷无止境20 分钟前
Orca:当五个AI程序员同时给你打工
人工智能·python
晴天1624 分钟前
操作系统开发入门-Day34
人工智能
牧羊人.33328 分钟前
计算机视觉基础第15章|DNN实现图像风格迁移
图像处理·人工智能·深度学习·opencv·计算机视觉
Mickey Q29 分钟前
【深度学习】权重衰减与 Dropout
人工智能·深度学习
欧特克_Glodon29 分钟前
OpenCV计算机视觉开发入门与实践<二十九>:grabCut算法分割图像
opencv·算法·计算机视觉·图像分割·grabcut 算法