使用OpenCV提取Python中单独帧的前景
问题
我正在使用一台相机,每隔大约5秒钟就会拍一张快照上传到网上。这台相机正在监控一排排的人。我希望我的脚本能够告诉我这排人的长度。
我尝试过的
一开始,我想用
BackgroundSubtractorMOG
来实现,但结果只得到了一张黑色的图像。以下是我修改后的代码,用图像代替视频捕捉:import numpy as np import cv2 frame = cv2.imread('sample.jpg') fgbg = cv2.BackgroundSubtractorMOG() fgmask = fgbg.apply(frame) cv2.imshow('frame', fgmask) cv2.waitKey()
接下来,我查看了图像前景提取,但这个方法需要互动,不适合我想要脚本自动告诉我排队人数的需求。
- 我还尝试使用peopledetect.py,但是因为拍摄的角度比较高,这个脚本无法检测到任何人。
我对opencv完全是新手,所以任何帮助都非常感谢。如果需要,我可以提供更多细节。
注意:
我并不是在寻找一个解决整体问题的方法,而是想找出一种方法来将人和背景分开。不过,如果你有更好的解决方案,我也愿意尝试不同的方法。
编辑:这是应要求提供的样本图像:
1 个回答
6
我搞明白了!@QED 帮我找到了答案。简单来说,你不能只用一张图片来完成这个任务。你至少需要两帧图像来进行比较,这样算法才能分辨出哪些是不同的(前景),哪些是相同的(背景)。所以我用了两帧图像,并循环处理它们来“训练”这个算法。以下是我的代码:
import numpy as np
import cv2
i = 1
while(1):
fgbg = cv2.BackgroundSubtractorMOG()
while(i < 3):
print 'img' + `i` + '.jpg'
frame = cv2.imread('img' + `i` + '.jpg')
fgmask = fgbg.apply(frame)
cv2.imshow('frame', fgmask)
i += 1
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cv2.destroyAllWindows()
这是两张连续图片的结果!