使用opencv for python从各个帧中提取前景

时间:2014-07-25 15:40:29

标签: python opencv

问题

我正在使用相机,每隔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()
    
  • 接下来,我查看了foreground extraction on an image,但这是互动的,不适合我需要脚本告诉我这一行人数多长的用例。

  • 我也尝试使用peopledetect.py,但由于该行的图像位于较高的位置,因此该脚本不会检测到任何人。

我是opencv的新手,所以非常感谢任何帮助。我可以根据要求提供任何其他细节。

注意:

我并不是在寻找能够解决整体问题的人,因为我只想找到一种方法将人们从背景中分离出来。但是,如果您认为自己有更好的解决方案,我愿意以不同的方式解决问题。

编辑:以下是所请求的示例图片: Sample

1 个答案:

答案 0 :(得分:4)

我明白了! @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()

这是连续2张图片的结果!

enter image description here