我需要做的很简单:
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
答案 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