使用OpenCV提取Python中单独帧的前景

2 投票
1 回答
7069 浏览
提问于 2025-04-18 14:46

问题

我正在使用一台相机,每隔大约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()

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

enter image description here

撰写回答