我正在使用每 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()
Run Code Online (Sandbox Code Playgroud)接下来,我查看了图像上的前景提取,但这是交互式的,不适合我需要脚本来告诉我一行人有多长的用例。
我是 opencv 的新手,所以非常感谢任何帮助。我可以根据要求提供任何其他详细信息。
我并不是在寻找解决整个问题的人,因为我只是想找出一种方法来将人们与背景区分开来。但是,如果您认为自己有更好的解决方案,我愿意以不同的方式解决问题。
编辑:这是要求的示例图像:
我想到了!@QED 帮助我到达那里。基本上,你不能只用一张图片来做到这一点。您需要至少 2 帧进行比较,以便算法可以分辨出什么是不同的(前景),什么是相同的(背景)。所以我拍摄了 2 帧并循环遍历它们以“训练”算法。这是我的代码:
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()
Run Code Online (Sandbox Code Playgroud)
这是 2 张连续图像的结果!