OpenCV:视频背景减除

目录

简述

[1. MOG](#1. MOG)

[🔷1.1 主要特点](#🔷1.1 主要特点)

[🔷1.2 代码示例](#🔷1.2 代码示例)

[🔷1.3 运行效果](#🔷1.3 运行效果)

[2. MOG2](#2. MOG2)

[🔷2.1 主要特点](#🔷2.1 主要特点)

[🔷2.2 代码示例](#🔷2.2 代码示例)

[🔷2.3 运行效果](#🔷2.3 运行效果)

[3. KNN](#3. KNN)

[4. GMG](#4. GMG)

[5. CNT](#5. CNT)

[6. LSBP](#6. LSBP)

[7. 如何选择适合的接口?](#7. 如何选择适合的接口?)

[🔷7.1 考虑场景的动态性](#🔷7.1 考虑场景的动态性)

[🔷7.2 考虑光照变化情况](#🔷7.2 考虑光照变化情况)

[🔷7.3 考虑实时性要求](#🔷7.3 考虑实时性要求)

[🔷7.4 考虑物体特征](#🔷7.4 考虑物体特征)

[🔷7.5 考虑阴影影响](#🔷7.5 考虑阴影影响)

[8. 资源下载](#8. 资源下载)


简述

在计算机视觉领域,背景减除广泛应用于目标检测、视频监控、运动分析等任务。OpenCV提供了多种背景减除算法:

  • cv2.bgsegm.createBackgroundSubtractorMOG
  • cv2.createBackgroundSubtractorMOG2
  • cv2.createBackgroundSubtractorKNN
  • cv2.bgsegm.createBackgroundSubtractorGMG
  • cv2.bgsegm.createBackgroundSubtractorCNT
  • cv2.bgsegm.createBackgroundSubtractorLSBP

1. MOG

基于高斯混合模型(Mixture of Gaussians, MOG)的背景减除算法。该算法通过多个高斯分布来对每个像素的颜色值进行建模,以表示背景的颜色变化。随着时间推移,不断更新这些高斯分布的参数,从而适应背景的缓慢变化。

python 复制代码
fgbg = cv2.bgsegm.createBackgroundSubtractorMOG(history=200, nmixtures=5, backgroundRatio=0.7, noiseSigma=0)

参数说明:

  • history:用于建模背景的历史帧数,默认 200。
  • nmixtures:高斯混合模型中的高斯分布数量,默认 5。
  • backgroundRatio:背景比例,用于确定哪些高斯分布属于背景,默认 0.7。
  • noiseSigma:噪声标准差,默认 0。

🔷1.1 主要特点

  • 早期的高斯混合模型实现,算法相对简单。
  • 对光照变化和背景动态变化的适应性较差。
  • 计算速度相对较快,但在复杂场景下检测精度有限。

🔷1.2 代码示例

python 复制代码
import cv2

cap = cv2.VideoCapture('D:\\resource\\opencv\\vtest.avi')
mog = cv2.bgsegm.createBackgroundSubtractorMOG()

while(True):
    ret, frame = cap.read()
    if ret == False:
        break

    mask = mog.apply(frame)
    cv2.imshow('img',mask)

    k = cv2.waitKey(10) 
    if k ==27:
        break

cap.release()
cv2.destroyAllWindows()

🔷1.3 运行效果

原始视频:

背景减除后:

2. MOG2

该接口是对 cv2.bgsegm.createBackgroundSubtractorMOG 的改进版本,同样基于高斯混合模型。它引入了一些优化机制,如自适应学习率和阴影检测,能更好地适应光照变化和背景的动态变化。

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

参数说明:

  • history:用于建模背景的历史帧数,默认 500。
  • varThreshold:像素与背景模型之间的方差阈值,用于判断像素是否属于前景,默认 16。
  • detectShadows:是否检测阴影,默认 True。

🔷2.1 主要特点

  • 对光照变化和背景动态变化有更好的适应性。
  • 能够检测阴影并将其以灰色显示在前景掩码中。
  • 计算复杂度相对较高,处理速度比 cv2.bgsegm.createBackgroundSubtractorMOG 稍慢。

🔷2.2 代码示例

python 复制代码
import cv2

cap = cv2.VideoCapture('D:\\resource\\opencv\\vtest.avi')
#mog = cv2.bgsegm.createBackgroundSubtractorMOG()
mog = cv2.createBackgroundSubtractorMOG2()

while(True):
    ret, frame = cap.read()
    if ret == False:
        break

    mask = mog.apply(frame)
    cv2.imshow('img',mask)

    k = cv2.waitKey(10) 
    if k ==27:
        break

cap.release()
cv2.destroyAllWindows()

🔷2.3 运行效果

3. KNN

基于 K最近邻(K - Nearest Neighbors, KNN)算法的背景减除方法。它通过对每个像素维护一个样本集,对于新的像素值,通过查找其 K 个最近邻来判断该像素是属于背景还是前景。

python 复制代码
fgbg = cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=400, detectShadows=True)

参数说明:

  • history(可选):用于建模背景的历史帧数,默认值为 500。
  • dist2Threshold(可选):像素与背景样本之间的距离阈值,用于判断像素是否属于前景,默认值为 400。
  • detectShadows(可选):是否检测阴影,默认值为 True。如果设置为 True,检测到的阴影将以灰色显示在前景掩码中。

主要特点:

  • 对动态背景有较好的适应性,能快速适应背景的变化。
  • 在某些场景下计算速度比 cv2.createBackgroundSubtractorMOG2 快。
  • 对噪声有一定的鲁棒性。

4. GMG

结合了统计模型和贝叶斯推理的方法。它首先使用前几帧图像来初始化背景模型,然后通过逐帧更新来适应背景的变化。该算法在处理光照变化和动态背景方面有一定的优势。

python 复制代码
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=120, decisionThreshold=0.8)

参数说明:

  • initializationFrames:用于初始化背景模型的帧数,默认 120。
  • decisionThreshold:决策阈值,用于判断像素是前景还是背景,默认 0.8。

主要特点:

  • 能够快速适应背景的初始变化。
  • 对于小的运动物体检测效果较好,但可能会产生较多的噪声。
  • 计算复杂度相对较高,处理速度较慢。

5. CNT

基于计数的背景减除算法。它为每个像素维护一个计数器,记录该像素值在一段时间内出现的次数。通过比较当前像素值的计数与阈值,判断该像素是属于背景还是前景。

python 复制代码
fgbg = cv2.bgsegm.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15 * 60, isParallel=True)

参数说明:

  • minPixelStability:像素成为背景所需的最小稳定帧数,默认 15。
  • useHistory:是否使用历史信息,默认 True。
  • maxPixelStability:像素保持稳定的最大帧数,默认 15 * 60。
  • isParallel:是否并行处理,默认 True。

主要特点:

  • 计算速度非常快,适合实时应用。
  • 对光照变化有一定的鲁棒性,但在复杂场景下的检测精度可能不如其他算法。

6. LOBSTER

基于局部二值模式的背景减除算法。它通过计算像素的局部二值模式来描述像素的纹理特征,从而更好地区分背景和前景。

python 复制代码
fgbg = cv2.bgsegm.createBackgroundSubtractorLSBP(
    mc=1,
    nSamples=20,
    LSBPRadius=16,
    Tlower=2.0,
    Tupper=32.0,
    Tinc=1.0,
    Tdec=0.05,
    Rscale=10.0,
    Rincdec=0.005,
    noiseRemovalThresholdFacBG=0.0004,
    noiseRemovalThresholdFacFG=0.0008
)

参数说明:

  • mc:多通道标志,默认值为 1,表示使用多通道模式。
  • nSamples:每个像素的样本数量,默认值为 20。这个参数决定了用于构建背景模型的样本数量,样本数越多,背景模型越稳定,但计算量也会相应增加。
  • LSBPRadius:LSBP 算子的半径,默认值为 16。它控制了 LBP 特征提取的邻域大小,半径越大,能捕捉到的纹理信息越丰富,但计算复杂度也会提高。
  • Tlower:前景阈值下限,默认值为 2.0。用于判断像素是否属于前景的较低阈值。
  • Tupper:前景阈值上限,默认值为 32.0。用于判断像素是否属于前景的较高阈值。
  • Tinc:阈值增加步长,默认值为 1.0。当像素被判定为前景时,背景模型的阈值会以这个步长增加。
  • Tdec:阈值减小步长,默认值为 0.05。当像素被判定为背景时,背景模型的阈值会以这个步长减小。
  • Rscale:半径缩放因子,默认值为 10.0。用于调整背景模型的更新速度。
  • Rincdec:半径缩放因子的增减步长,默认值为 0.005。用于控制半径缩放因子的动态调整。
  • noiseRemovalThresholdFacBG:背景噪声去除阈值因子,默认值为 0.0004。用于去除背景中的噪声点。
  • noiseRemovalThresholdFacFG:前景噪声去除阈值因子,默认值为 0.0008。用于去除前景中的噪声点。

主要特点:

  • 对于具有明显纹理差异的前景和背景,能够更准确地区分。
  • 利用纹理特征进行背景减除,可以在一定程度上减少由于光照变化、噪声等因素导致的误检。
  • 计算复杂度较高,处理速度相对较慢,不太适合对实时性要求极高的场景。

7. 如何选择适合的接口?

🔷7.1 考虑场景的动态性

如果背景基本保持不变或者变化非常缓慢,例如监控固定场景(如室内走廊、停车场等)。考虑以下接口:

  • cv2.bgsegm.createBackgroundSubtractorMOG
  • cv2.bgsegm.createBackgroundSubtractorCNT

当背景存在一定的动态变化,如风吹动的树叶、晃动的水面等。考虑以下接口:

  • cv2.createBackgroundSubtractorMOG2
  • cv2.createBackgroundSubtractorKNN

🔷7.2 考虑光照变化情况

在光照基本不变的环境中,上述提到的 :

  • cv2.bgsegm.createBackgroundSubtractorMOG
  • cv2.bgsegm.createBackgroundSubtractorCNT

可以满足需求,它们在光照稳定时能以高效的方式进行背景减除。

在光照剧烈变化的场景中,优先考虑:

  • cv2.createBackgroundSubtractorMOG2

它能够自适应光照的变化,通过不断调整背景模型来适应光照强度和颜色的改变。

🔷7.3 考虑实时性要求

如实时视频监控、工业自动化中的快速检测等场景,需要算法能够在短时间内完成处理。

  • cv2.bgsegm.createBackgroundSubtractorCNT

是最佳选择,其计算速度非常快,并且支持并行处理,能够满足实时处理的需求。

当处理速度不是首要考虑因素,更注重检测的准确性时,可以选择:

  • cv2.createBackgroundSubtractorMOG2
  • cv2.bgsegm.createBackgroundSubtractorLSBP

cv2.createBackgroundSubtractorMOG2 虽然计算复杂度较高,但能提供更准确的前景检测结果;cv2.bgsegm.createBackgroundSubtractorLSBP 基于局部二值模式,对纹理特征有较好的捕捉能力,能减少误检,但计算速度较慢。

🔷7.4 考虑物体特征

小运动物体的检测:

  • cv2.bgsegm.createBackgroundSubtractorGMG

对于小的运动物体检测效果较好,它在初始化背景模型后能快速响应小物体的运动,但可能会产生较多噪声。

对纹理特征要求较高的场景:

  • cv2.bgsegm.createBackgroundSubtractorLSBP

🔷7.5 考虑阴影影响

如果场景中阴影的存在会干扰前景物体的检测,需要选择支持阴影检测的算法:

  • cv2.createBackgroundSubtractorMOG2
  • cv2.createBackgroundSubtractorKNN

都具备阴影检测功能,它们可以将检测到的阴影以灰色显示在前景掩码中,避免阴影被误判为前景物体。

8. 资源下载

通过网盘分享的文件:vtest.avi

链接: https://pan.baidu.com/s/1LqFBQUAssC9qbynf9U5LOg?pwd=csdn 提取码: csdn

相关推荐
余~~185381628001 分钟前
矩阵NFC碰一碰发视频的源码技术开发攻略,支持OEM
线性代数·矩阵·音视频
Amarantine、沐风倩✨1 分钟前
区块链技术未来发展趋势(人工智能和物联网领域)
人工智能·物联网·区块链
寰宇软件9 分钟前
PHP音视频课程培训系统
小程序·uni-app·php·音视频
LeeZhao@15 分钟前
【AIGC魔童】DeepSeek v3提示词Prompt书写技巧
人工智能·语言模型·自然语言处理·面试·prompt·aigc
nangonghen18 分钟前
user、assistant、system三大角色在大语言模型中的作用(通俗解释)
人工智能·语言模型·大模型
huaqianzkh34 分钟前
了解深度信念网络(Deep Belief Networks,DBN)
人工智能
chengpei14739 分钟前
Spring Boot整合DeepSeek实现AI对话
人工智能·spring boot·ai
张登杰踩1 小时前
【模型部署】大模型部署工具对比:SGLang, Ollama, VLLM, LLaMA.cpp如何选择?
人工智能·llama
微软技术栈2 小时前
活动预告 |【Part1】Microsoft Azure 在线技术公开课:AI 基础知识
人工智能·microsoft·azure
nbsaas-boot5 小时前
人工智能浪潮下脑力劳动的变革与重塑:挑战、机遇与应对策略
人工智能