背景建模(基于视频,超炫)项目实战!

什么是背景建模

许多人可能不知道什么是背景建模,,下面我先解释一下

指在计算机视觉中,从视频序列中提取出静态背景的一种技术。在视频中,背景通常被定义为相对稳定的部分,例如墙壁、地面或天空等。背景建模的目标是将动态的前景对象与静态的背景进行分离,以便进一步分析和处理。

方法

解释

我先解释下帧差法,这个就是用视频的前后两个帧图片进行相减,然后求出不同的地方,那么这个不同的地方就是运动的,这个地方就是人或者车子在动。

代码部分

复制代码
import cv2
import numpy as np

# 创建视频捕获对象,读取视频文件
cap = cv2.VideoCapture('test.avi')  # 或者使用摄像头: cap = cv2.VideoCapture(0)
# cap = cv2.VideoCapture(0)
# 创建MOG2背景减除器,用于检测运动物体
# history: 用于建模的历史帧数,detectShadows: 是否检测阴影(True为检测)
fgbg = cv2.createBackgroundSubtractorMOG2(history=500, detectShadows=True)

# 创建椭圆形结构元素(卷积核),用于形态学操作
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))

while True:
    # 读取视频帧
    ret, frame = cap.read()
    if not ret:
        break

    # 应用背景减除器,获取前景掩码(运动物体区域)
    fgmask = fgbg.apply(frame)

    # 形态学开运算(先腐蚀后膨胀),去除噪声和小斑点
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)

    # 查找轮廓
    contours, _ = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 在原帧上绘制检测结果
    for contour in contours:
        # 过滤掉太小的轮廓(可能是噪声)
        if cv2.contourArea(contour) < 188:  # 面积阈值,可根据需要调整
            continue

        # 获取轮廓的边界框
        x, y, w, h = cv2.boundingRect(contour)

        # 在原图上绘制矩形框标记运动物体
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        cv2.putText(frame, "Moving Object", (x, y - 5),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    # 显示原始帧和处理结果
    cv2.imshow('Original Frame', frame)
    cv2.imshow('Foreground Mask', fgmask)

    # 按ESC键退出
    if cv2.waitKey(30) & 0xFF == 27:
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

效果展示

关键步骤解读

1 模型建立

复制代码
fgbg = cv2.createBackgroundSubtractorMOG2(history=500, detectShadows=True)

# 创建椭圆形结构元素(卷积核),用于形态学操作
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))

我们先从cv2的库中找到这些接口,然后创建,再创建出结构元素,用于对图片进行处理。

2 背景去除器

复制代码
    fgmask = fgbg.apply(frame)
    cv2.imshow('frame', fgmask)
    # 形态学开运算(先腐蚀后膨胀),去除噪声和小斑点
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)

这个我=相当于我们有一个掩膜,帮助我们去除除了运动物体外的东西,例如背景,然后我们经过开运算去除一些噪点。

3 画出人

复制代码
    for contour in contours:
        # 过滤掉太小的轮廓(可能是噪声)
        if cv2.contourArea(contour) < 188:  # 面积阈值,可根据需要调整
            continue

        # 获取轮廓的边界框
        x, y, w, h = cv2.boundingRect(contour)

        # 在原图上绘制矩形框标记运动物体
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        cv2.putText(frame, "Moving Object", (x, y - 5),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

这里就是把人的轮廓画出来,然后把比较小的轮廓给去除了,然后把是人的地方取外界矩形,然后就可以画出来了,并添加文字。

ok啦上面就是我们的全部内容了,这里我们可以仔细想想,是不是我们老家的摄像头会有一种功能,就是有人的时候就会警告,其实就是用这种方法来进行的。

相关推荐
LabVIEW开发15 小时前
LabVIEW液位边缘检测
图像处理·计算机视觉·labview·labview知识·labview功能·labview程序
Hody9115 小时前
【XR技术介绍】空间音频(Spatial Audio):原理是什么?如何让声音听起来像是从你身后传来的?
音视频·xr
jiushun_suanli15 小时前
AI生成音频:技术概述与实践指南
人工智能·经验分享·音视频
地狱为王15 小时前
Unity使用RVM实现实时人物视频抠像(无绿幕)
unity·游戏引擎·音视频
诗句藏于尽头16 小时前
MediaPipe+OpenCV的python实现交互式贪吃蛇小游戏
人工智能·python·opencv
音视频牛哥17 小时前
从云平台到系统内核:SmartMediakit如何重构实时视频系统
计算机视觉·音视频·gb28181对接·rtsp播放器rtmp播放器·smartmediakit·智能机器人低延迟播放方案·rtmp摄像头同屏推流
智驱力人工智能19 小时前
智能安全管理 基于视觉分析的玩手机检测系统 手机行为AI模型训练 边缘计算手机行为监测设备
人工智能·安全·目标检测·计算机视觉·智能手机·视觉检测·边缘计算
ACP广源盛139246256731 天前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
花姐夫Jun1 天前
基于Vue+Python+Orange Pi Zero3的完整视频监控方案
vue.js·python·音视频
王哈哈^_^1 天前
【数据集】【YOLO】【目标检测】共享单车数据集,共享单车识别数据集 3596 张,YOLO自行车识别算法实战训推教程。
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计