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

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

文章目录

一. 多个背景减除器(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 提供的不同背景减除器的示例代码,展示如何加载视频并检测前景:

python 复制代码
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 等参数来优化性能。

扩展

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

python 复制代码
# 初始化视频写入器
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()

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

相关推荐
leegong231113 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
牧歌悠悠3 小时前
【深度学习】Unet的基础介绍
人工智能·深度学习·u-net
坚毅不拔的柠檬柠檬3 小时前
AI革命下的多元生态:DeepSeek、ChatGPT、XAI、文心一言与通义千问的行业渗透与场景重构
人工智能·chatgpt·文心一言
坚毅不拔的柠檬柠檬3 小时前
2025:人工智能重构人类文明的新纪元
人工智能·重构
jixunwulian4 小时前
DeepSeek赋能AI边缘计算网关,开启智能新时代!
人工智能·边缘计算
Archie_IT4 小时前
DeepSeek R1/V3满血版——在线体验与API调用
人工智能·深度学习·ai·自然语言处理
Moonnnn.4 小时前
51单片机学习——动态数码管显示
笔记·嵌入式硬件·学习·51单片机
大数据追光猿4 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
南宫生4 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
技术小齐5 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习