当前位置: 首页 > article >正文

opencv(15) OpenCV背景减除器(Background Subtractors)学习

-下面内容来自chatgpt,为本人学习参考,也供大家参考

文章目录

    • 一. 多个背景减除器(Background Subtractors)算法
      • **1. `cv2.createBackgroundSubtractorMOG2`**
        • **简介**
        • **参数**
        • **特性**
      • **2. `cv2.createBackgroundSubtractorKNN`**
        • **简介**
        • **参数**
        • **特性**
      • **3. `cv2.bgsegm.createBackgroundSubtractorMOG`**
        • **简介**
        • **参数**
        • **特性**
      • **4. `cv2.bgsegm.createBackgroundSubtractorGMG`**
        • **简介**
        • **参数**
        • **特性**
      • **5. `cv2.bgsegm.createBackgroundSubtractorCNT`**
        • **简介**
        • **参数**
        • **特性**
      • **6. `cv2.bgsegm.createBackgroundSubtractorLSBP`**
        • **简介**
        • **参数**
        • **特性**
      • **7. `cv2.bgsegm.createBackgroundSubtractorGSOC`**
        • **简介**
        • **特性**
      • **选择合适的算法**
    • 二. 示例代码
      • **说明**
      • **扩展**

一. 多个背景减除器(Background Subtractors)算法

OpenCV 提供了多个背景减除器(Background Subtractors),每种算法都有不同的特点,适用于不同的应用场景。以下是主要的背景减除器及其特性:

1. cv2.createBackgroundSubtractorMOG2

简介
  • 高斯混合模型 (Mixture of Gaussians, MOG) 的改进版本。
  • 使用多个高斯分布来建模背景,每个像素点根据高斯模型的匹配情况判断是否属于前景。
参数
  • history: 背景模型的历史帧数。
  • varThreshold: 像素点属于背景的方差阈值。
  • detectShadows: 是否检测阴影。
特性
  • 优点
    • 能够很好地处理光线变化。
    • 阴影检测(如果 detectShadows=True),阴影区域通常标记为灰色。
  • 缺点
    • 对于快速移动的前景或剧烈的光线变化,可能表现较差。
  • 适用场景
    • 视频监控。
    • 室外场景中的目标检测。

2. cv2.createBackgroundSubtractorKNN

简介
  • 基于 K 近邻(K-Nearest Neighbors)的背景建模算法。
  • 使用最近的帧进行背景建模,计算像素点与背景的欧几里得距离。
参数
  • history: 背景模型的历史帧数。
  • dist2Threshold: 判断像素点属于前景的平方距离阈值。
  • detectShadows: 是否检测阴影。
特性
  • 优点
    • 对动态背景(如风吹树叶)表现较好。
    • 对于缓慢移动的物体,能适应背景更新。
  • 缺点
    • 阴影检测效果较弱(比 MOG2 稍差)。
  • 适用场景
    • 行人检测。
    • 交通场景中的车辆检测。

3. cv2.bgsegm.createBackgroundSubtractorMOG

简介
  • MOG 的早期版本。
  • 使用固定数量的高斯分布建模背景。
参数
  • MOG2 类似,但功能较少。
特性
  • 优点
    • 计算速度较快。
  • 缺点
    • 不能很好处理动态背景。
    • 阴影检测能力弱。
  • 适用场景
    • 资源有限的环境下的目标检测。

4. cv2.bgsegm.createBackgroundSubtractorGMG

简介
  • 使用统计学方法和贝叶斯推断来建模背景。
  • 初始几帧用于建模背景(热身阶段)。
参数
  • initializationFrames: 初始化的帧数。
  • decisionThreshold: 判断像素属于前景的阈值。
特性
  • 优点
    • 初始几帧之后,前景检测准确性较高。
    • 对突然的光线变化具有更好的鲁棒性。
  • 缺点
    • 热身阶段需要多帧图像。
    • 处理速度较慢。
  • 适用场景
    • 室外场景中的复杂背景建模。

5. cv2.bgsegm.createBackgroundSubtractorCNT

简介
  • 基于非递归快速更新背景模型的算法。
  • 不会保存背景模型的完整历史,使用计数器统计前景出现频率。
参数
  • minPixelStability: 像素点被认为是背景所需的稳定帧数。
  • useHistory: 是否使用历史帧。
  • maxPixelStability: 像素点被认为是背景的最长帧数。
特性
  • 优点
    • 对内存的使用更少。
    • 计算效率高,适合实时应用。
  • 缺点
    • 对光线变化的适应性较弱。
  • 适用场景
    • 嵌入式系统或资源受限的设备。

6. cv2.bgsegm.createBackgroundSubtractorLSBP

简介
  • 基于局部二值模式(Local Binary Pattern, LSBP)的背景减除器。
  • 使用像素邻域的信息来建模背景。
参数
  • lsbpRadius: LSBP 的半径。
  • tLower, tUpper: 像素值的变化范围阈值。
  • numSamples: 用于建模的样本数。
特性
  • 优点
    • 对动态背景和阴影具有较好的鲁棒性。
    • 对缓慢移动物体的检测效果优于传统算法。
  • 缺点
    • 计算复杂度较高。
  • 适用场景
    • 高分辨率视频的背景减除。
    • 复杂动态背景的前景检测。

7. cv2.bgsegm.createBackgroundSubtractorGSOC

简介
  • 基于几何和颜色的背景减除算法。
  • 将几何信息与颜色信息结合,用于背景建模。
特性
  • 优点
    • 对剧烈光线变化和动态背景有较好的鲁棒性。
    • 检测精度高,特别是对于复杂场景。
  • 缺点
    • 处理速度较慢。
  • 适用场景
    • 需要高精度目标检测的复杂背景场景。

选择合适的算法

根据应用场景选择合适的背景减除器:

  1. 实时性要求高(低资源)KNN, CNT
  2. 复杂动态背景LSBP, GSOC
  3. 光线变化明显MOG2, GMG
  4. 精度要求高LSBP, GSOC

二. 示例代码

以下是使用 OpenCV 提供的不同背景减除器的示例代码,展示如何加载视频并检测前景:

import cv2
import numpy as np

# 加载视频
video_path = "input_video.mp4"  # 替换为你的视频路径
cap = cv2.VideoCapture(video_path)

# 创建背景减除器实例
# 选择以下其中一种:
bg_subtractor = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=50, detectShadows=True)  # MOG2
# bg_subtractor = cv2.createBackgroundSubtractorKNN(history=100, dist2Threshold=400.0, detectShadows=False)  # KNN
# bg_subtractor = cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=120, decisionThreshold=0.8)  # GMG
# bg_subtractor = cv2.bgsegm.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=900)  # CNT
# bg_subtractor = cv2.bgsegm.createBackgroundSubtractorLSBP()  # LSBP
# bg_subtractor = cv2.bgsegm.createBackgroundSubtractorGSOC()  # GSOC

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 转换为灰度(根据需要)
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 应用背景减除器
    foreground_mask = bg_subtractor.apply(frame)

    # 后处理:去噪声和填充小孔
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
    foreground_mask = cv2.morphologyEx(foreground_mask, cv2.MORPH_OPEN, kernel)
    foreground_mask = cv2.morphologyEx(foreground_mask, cv2.MORPH_CLOSE, kernel)

    # 可视化结果
    cv2.imshow('Original Frame', frame)
    cv2.imshow('Foreground Mask', foreground_mask)

    # 按 'q' 键退出
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

说明

  1. 背景减除器选择

    • 替换 bg_subtractor 的初始化部分来使用不同的背景减除器(如 MOG2KNN 等)。
  2. 后处理

    • 使用形态学操作(cv2.MORPH_OPENcv2.MORPH_CLOSE)来去除噪声和填补小孔。
  3. 运行效果

    • Foreground Mask 窗口会显示前景区域的二值化结果(白色表示前景,黑色表示背景)。
    • 不同算法可能在相同场景下表现不同,例如:
      • MOG2 在处理光线变化时效果较好。
      • KNN 对缓慢变化的背景更鲁棒。
  4. 性能调节

    • 调整 historyvarThresholddist2Threshold 等参数来优化性能。

扩展

如果需要保存结果视频,可以加入以下代码:

# 初始化视频写入器
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (frame.shape[1], frame.shape[0]))

# 在循环中添加:
out.write(foreground_mask)

# 循环结束后释放:
out.release()

这会将前景掩码保存为视频。根据需要可以进一步处理前景区域(如轮廓检测、目标跟踪等)。如果有特定需求,请随时告诉我!


http://www.kler.cn/a/453645.html

相关文章:

  • Java爬虫技术:按关键字搜索VIP商品详情
  • Cascader 级联选择器一级单选二级多选
  • 如何在机房里脱困(下)
  • 实现点击表格中的邀请码并复制到剪贴板的功能
  • 【GeekBand】C++设计模式笔记15_Proxy_代理模式
  • Python的安装过程和环境搭建(超详细过程)
  • mui框架开发的手机app--爱分销【无后端】
  • Spring Boot Web服务接口处理JSON入参时首字母大写问题的解决方案
  • 记一次rac故障原因分析(虚拟化平台)
  • 【搭建一个网上商城系统】
  • 大模型应用技术系列(三): 深入理解大模型应用中的Cache:GPTCache
  • [python SQLAlchemy数据库操作入门]-06.如何高效查询特定股票的历史行情
  • 基于STM32单片机矿井矿工作业安全监测设计
  • WiFi、蓝牙共存,物联网无线通信技术,设备无线连接数据传输应用
  • 关于在M系列的Mac中使用SoftEtherClient软件
  • 如何卸载和升级 Angular-CLI ?
  • 梳理你的思路(从OOP到架构设计)_设计模式Android + Composite模式
  • FPGA的DMA应用——pcileech
  • 路由器转发数据报的封装过程
  • 【合作原创】使用Termux搭建可以使用的生产力环境(八)
  • docker-compose的安装,使用教程及使用yaml搭建个人博客
  • 大模型(LLM)提示工程(Prompt Engineering)初识
  • Mac电脑移动端抓包
  • 图解设计模式
  • 【Rust自学】5.3. struct的方法(Method)
  • Type-C单口便携显示器LDR6021