OpenCV:视频背景减除

目录

简述

1. MOG

1.1 主要特点

1.2 代码示例

1.3 运行效果

2. MOG2

2.1 主要特点

2.2 代码示例 

2.3 运行效果

3. KNN

4. GMG 

5. CNT

6. LSBP

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

7.1 考虑场景的动态性

7.2  考虑光照变化情况

7.3 考虑实时性要求

7.4 考虑物体特征

7.5 考虑阴影影响

8. 资源下载 


简述

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

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

1. MOG

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

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 代码示例

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 运行效果

原始视频:

背景减除后:

OpenCV:视频背景减除_第1张图片

2. MOG2

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

fgbg = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True)

参数说明:

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

2.1 主要特点

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

2.2 代码示例 

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 运行效果

OpenCV:视频背景减除_第2张图片

3. KNN

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

fgbg = cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=400, detectShadows=True)

参数说明:

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

主要特点:

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

4. GMG 

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

fgbg = cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=120, decisionThreshold=0.8)

参数说明:

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

主要特点:

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

5. CNT

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

fgbg = cv2.bgsegm.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15 * 60, isParallel=True)

参数说明:

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

主要特点:

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

6. LOBSTER

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

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

你可能感兴趣的:(计算机视觉,opencv,音视频,人工智能,计算机视觉)