opencv-python 视频前后景分离

发布时间 2023-08-10 22:12:52作者: 寒水浮云

背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术。BS计算前景掩码,在当前帧与背景模型之间执行减法运算,其中包含场景的静态部分,或者更一般而言,考虑到所观察场景的特征,可以将其视为背景的所有内容。

前后景分离分为两步:第一步,计算背景的初始模型;第二步,更新模型以适应场景中可能的变化。

opencv中视频前后景分离的方法通常由3个,都是第三方的包。

1 混合高斯模型为基础的前后景分离方法

createBackgroundSubtractorMOG([, history[, nmixtures[, backgroundRatio[, noiseSigma]]]]) -> retval

history:进行建模的时候需要多长时间的参考帧,默认200ms

nmixtures:高斯范围值,默认5

backgroundRatio:背景比例,莫默认0.7

noiseSigma:降噪,默认0,表示自动降噪

上述参数通常不需要修改。

2 MOG2方法

同MOG类似,但是对亮度产生的阴影有更好的识别,缺点是会产生很多细小噪声。

createBackgroundSubtractorMOG2([, history[, varThreshold[, detectShadows]]]) -> retval

history:默认500ms  

detectShadows:是否检测阴影,默认True。

3 GMG方法

静态背景图像估计和每个像素的贝叶斯分割,抗噪性更强。

createBackgroundSubtractorGMG([, initializationFrames[, decisionThreshold]]) -> retval

initializationFrames:初始化帧数,默认120帧

前后景分离的实例视频是经典的 vtest.avi,三种背景分离方法如下:

import cv2
import numpy as np

cap = cv2.VideoCapture('./vtest.avi')
fps = cap.get(cv2.CAP_PROP_FPS)
# print(fps)

# MOG算法
mog = cv2.bgsegm.createBackgroundSubtractorMOG()   #bgsegm是三方的一个包

#MOG2 与MOG类似,但是对亮度产生的阴影有更好的识别,缺点是会产生很多细小的噪点。
mog2 = cv2.createBackgroundSubtractorMOG2() 

#GMG去背景:静态背景图像估计,和每个像素的贝叶斯分割,抗噪性强。(实际上噪声还是比较多)
gmg = cv2.bgsegm.createBackgroundSubtractorGMG()

while True:
    ret,frame = cap.read()
    
    if ret == True:
        
        fgmask2 = mog2.apply(frame) #应用前后景分离算法
        fgmask = mog.apply(frame)
        fgmask_gmg = gmg.apply(frame)
        
        cv2.imshow('fgmask',fgmask)
        cv2.imshow('fgmask2',fgmask2)
        cv2.imshow('fgmask_gmg',fgmask_gmg)
        
        key = cv2.waitKey(10)
        if key == ord('q'):
            break
    else:   #视频播放完毕,退出循环
        break
cap.release()
cv2.destroyAllWindows()

 

 

 就个人感觉而言,MOG2效果最好,也可能是opencv版本和算法版本问题。