似乎更改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)
在为某些帧运行该代码块之后,该窗口显示第一个背景减法器的结果,第二个结果和两者的差异。
因为两个面具是相同的,所以它们的差异(第三个窗格)的结果是一个完整的黑色框架:
然后,突然改变视频源(第二个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)
在为某些帧运行该代码块后,您得到:
两个前景蒙版看起来相同,这就是第三个窗格是全黑框架的原因。
但是,在运行最后一段代码超过3帧后,第二个窗格的结果应该再次变黑(因为history=3
对象的创建中bg2
。但是两个背景减法器都会得到相同的结果(如第三个完整的黑色窗格所示)。
我也尝试用以下方法修改参数:
bg2.setInt('history')
但我得到的结果相同。
而且我总是得到我所做的“设定”(例如):
>>>bg2.getInt('history')
3
我有什么遗漏吗?
答案 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)