【问题标题】:Extract foreground from individual frames using opencv for python使用opencv for python从单个帧中提取前景
【发布时间】:2014-07-25 15:40:29
【问题描述】:

问题

我正在使用每 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 的新手,非常感谢任何帮助。我可以根据要求提供任何其他详细信息。

注意:

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

编辑:这是根据要求提供的示例图片:

【问题讨论】:

  • 您能否提供一个示例,说明您的视频中的 a 帧是什么样的?也许人和背景之间的对比度太差,以至于背景减法没有任何用处
  • @rayryeng 确定,编辑了帖子
  • 酷。我会玩这个。同时,此方法有一些默认参数,您正在调用这些默认参数。我会玩弄这些参数,看看是否有任何成果,但请看这里:docs.opencv.org/modules/video/doc/…
  • 太棒了,我也会搞砸这些。谢谢!
  • 还可以在这里查看参数说明以及默认值:coderexception.com/CNbbzHbbPUJyXyxy/…

标签: python opencv


【解决方案1】:

我想通了! @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 个连续图像的结果!

【讨论】:

  • 别担心!我还可以了解它是如何工作的,看到你的结果真的很酷!我对 OpenCV 也比较陌生,所以我会一直保密。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2018-03-09
  • 2021-06-26
  • 2020-10-03
  • 2017-05-06
  • 1970-01-01
  • 2019-07-17
相关资源
最近更新 更多