OpenCV Python cv2.BackgroundSubtractor参数

时间:2014-11-04 17:14:09

标签: python opencv parameters background-subtraction

摘要

似乎更改BackgroundSubtractorMOG的参数不会影响算法的结果。

我使用Python:2.7.6 | Anaconda 2.1.0(64位)
OpenCV:'2.4.10'
操作系统:Windows 7 x64

算法的默认参数为:

history=200, nmixtures=5, backgroundRatio=0.7

因此,创建具有不同参数的背景减法器会产生不同的结果。但我总是使用默认参数和自定义参数获得相同的结果(前景蒙版)。


重现问题

首先,创建两个具有不同参数的背景减法器对象:

bg1 = cv2.BackgroundSubtractorMOG()
bg2 = cv2.BackgroundSubtractorMOG(history=3, nmixtures=5, backgroundRatio=0.0001)

创建2个“VideoCaptrue”对象:

cap = cv2.VideoCapture('video.mp4')
cap2 = cv2.VideoCapture('different_video.mp4')

测试结果:

# Get a frame from the first capturing object:
frame = cap.read()[1]

# Get the foreground mask from both background subtractors:
fg1 = bg1.apply(frame)
fg2 = bg2.apply(frame)

# Show both results and the difference between them:
cv2.imshow('Window name', np.hstack((fg1, fg2, fg1 - fg2)))
cv2.waitKey(30)

在为某些帧运行该代码块之后,该窗口显示第一个背景减法器的结果,第二个结果和两者的差异。

因为两个面具是相同的,所以它们的差异(第三个窗格)的结果是一个完整的黑色框架:

2 BackgroundSubtractorMOG and difference

然后,突然改变视频源(第二个VideoCapture对象):

# Get a frame from the second capturing object:
frame = cap2.read()[1]

# Get the foreground mask from both background subtractors:
fg1 = bg1.apply(frame)
fg2 = bg2.apply(frame)

# Show both results and the difference between them:
cv2.imshow('Window name', np.hstack((fg1, fg2, fg1 - fg2)))
cv2.waitKey(30)

在为某些帧运行该代码块后,您得到:

2 BackgroundSubtractorMOG and difference with new video

两个前景蒙版看起来相同,这就是第三个窗格是全黑框架的原因。

但是,在运行最后一段代码超过3帧后,第二个窗格的结果应该再次变黑(因为history=3对象的创建中bg2。但是两个背景减法器都会得到相同的结果(如第三个完整的黑色窗格所示)。


替代

我也尝试用以下方法修改参数:

bg2.setInt('history')

但我得到的结果相同。

而且我总是得到我所做的“设定”(例如):

>>>bg2.getInt('history')
3

我有什么遗漏吗?

1 个答案:

答案 0 :(得分:5)

当我从apply对象调用方法BackgroundSubtractorMOG时,我发现(因为某些版本的OpenCV),它使用learningRate设置的默认0.0参数,所以BackgroundSubtractor不是"学习"新的帧,它只是坚持使用的第一帧。

为了避免这种情况,我必须使用显式的learningRate参数调用方法apply,然后它就像以前一样工作。

所以在启动代码之后:

bg1 = cv2.BackgroundSubtractorMOG()
cap = cv2.VideoCapture('video.mp4')
frame = cap.read()[1]

......而不是:

fg1 = bg1.apply(frame)

我应该这样做:

fg1 = bg1.apply(frame, learningRate=0.001)