Python opencv背景减法

时间:2014-10-13 15:52:35

标签: python opencv

我需要做的很简单:

1-加载5帧视频文件
2-检测背景
3-每一帧,一个接一个:
- 1-减去背景(创建前景蒙版)
- 2-对前景蒙版进行一些计算 - 3-保存原始帧和前景掩码

只看到5帧和5个相应的fgmasks:

import numpy as np
import cv2  
cap = cv2.VideoCapture('test.avi')
fgbg = cv2.BackgroundSubtractorMOG()

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    fgmask = fgbg.apply(frame)
    # Display the fgmask frame
    cv2.imshow('fgmask',fgmask)
    # Display original frame
    cv2.imshow('img', frame)

    k = cv2.waitKey(0) & 0xff
    if k == 5:
        break

cap.release()
cv2.destroyAllWindows()

每个帧都被正确打开并显示,但显示的fgmask与显示的原始帧不对应。在这个过程的某个地方,fgmasks的顺序变得混杂起来。

背景确实被正确删除但我没有得到5个预期的fgmasks。

我错过了什么?我觉得这应该是直截了当的:while循环遍历视频的5帧,fgbg.apply将背景减法函数应用于每个帧。

的OpenCV-2.4.9-3

1 个答案:

答案 0 :(得分:1)

正如bikz05所说,运行平均方法在我的5个图像集上工作得相当好。谢谢你的提示!

import cv2
import numpy as np

c = cv2.VideoCapture('test.avi')
_,f = c.read()

avg1 = np.float32(f)
avg2 = np.float32(f)

# loop over images and estimate background 
for x in range(0,4):
    _,f = c.read()

    cv2.accumulateWeighted(f,avg1,1)
    cv2.accumulateWeighted(f,avg2,0.01)

    res1 = cv2.convertScaleAbs(avg1)
    res2 = cv2.convertScaleAbs(avg2)

    cv2.imshow('img',f)
    cv2.imshow('avg1',res1)
    cv2.imshow('avg2',res2)
    k = cv2.waitKey(0) & 0xff
    if k == 5:
        break