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()

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

相关推荐
AI模块工坊1 小时前
CVPR 即插即用 | PConv:重新定义高效卷积,一个让模型“跑”得更快、更省的新范式
人工智能·深度学习·计算机视觉·transformer
驭风少年君1 小时前
《搭建属于自己的网站之网页前端学习》基础入门
前端·学习
lzjava20241 小时前
Spring AI加DeepSeek实现一个Prompt聊天机器人
人工智能·spring·prompt
fanstuck3 小时前
AI辅助数学建模有哪些优势?
人工智能·数学建模·语言模型·aigc
CIb0la3 小时前
能保持精神专注的爱好能给生活带来种种积极的转变
运维·学习·生活
一只安3 小时前
从零开发AI(不依赖任何模型)
人工智能·python
11年老程序猿在线搬砖3 小时前
如何搭建自己的量化交易平台
大数据·人工智能·python·自动交易·量化交易系统
Elastic 中国社区官方博客3 小时前
Elasticsearch 开放推理 API 增加了对 Google 的 Gemini 模型的支持
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·googlecloud
却道天凉_好个秋3 小时前
OpenCV(十五):绘制矩形和圆
opencv
周杰伦_Jay3 小时前
【实战|旅游知识问答RAG系统全链路解析】从配置到落地(附真实日志数据)
大数据·人工智能·分布式·机器学习·架构·旅游·1024程序员节