【问题标题】:Background extraction in Python using open CV使用 Open CV 在 Python 中提取背景
【发布时间】:2012-05-16 15:03:17
【问题描述】:

我正在尝试从视频中提取背景图像,以便检测其中的移动物体。 我找到了 cv2.BackgroundSubtractorMOG() 之类的函数,但是我无法让它工作。 有人有使用这个的经验吗?

我已经创建了对象mog = cv2.BackgroundSubtractorMOG(300,-1,-1,-1)

然后我尝试mog.apply(Nmat,Nforemat,-1),但这似乎不起作用,我得到以下 错误:

......\OpenCV-2.4.0\modules\video\src\bgfg_gaussmix.cpp:117: 错误:(-215) CV_MAT_DEPTH(frameType) == CV_8U

Nmat 和 N foremat 是 numpy 数组,因为如果它们不是,我也会收到错误。

这里正在进行中...

import cv
import cv2
import numpy as np

if __name__ == '__main__':
  cv.NamedWindow("test1", cv.CV_WINDOW_AUTOSIZE)
  cv.NamedWindow("test2", cv.CV_WINDOW_AUTOSIZE)
  capture = cv.CreateFileCapture('test.avi')
  frame = cv.QueryFrame(capture)

  img = cv.CreateImage(cv.GetSize(frame),8,1)
  thresh = cv.CreateImage(cv.GetSize(frame),8,1)
  foreground = cv.CreateImage(cv.GetSize(frame),8,1)
  foremat = cv.GetMat(foreground)
  Nforemat = np.array(foremat, dtype=np.float32)

  thresh = cv.CreateImage(cv.GetSize(img),8,1)
  mog = cv2.BackgroundSubtractorMOG()

  loop = True
  nframes=0
  while(loop):
    frame = cv.QueryFrame(capture)
    mat = cv.GetMat(frame)
    Nmat = np.array(mat, dtype=np.float32)

    cv.CvtColor(frame,img,cv.CV_BGR2GRAY)

    if (frame == None):
        break

    mog.apply(Nmat,Nforemat,-1)
    cv.Threshold(img,thresh,100,255,cv.CV_THRESH_BINARY)

    cv.ShowImage("test1", thresh)
    cv.ShowImage("test2",frame)
    char = cv.WaitKey(50)
    if (char != -1):
        if (char == 27):
                break
  cv.DestroyWindow("test1")
  cv.DestroyWindow("test2")

【问题讨论】:

  • 如果使用 cv2 版本的 opencv 函数,它们已经是 numby 数组了
  • 谢谢,这很有用,我只使用库中的 cv2 函数重写了代码,一切正常!当然,由于我错过了某些方法的使用,因此对代码进行了很少的修改。
  • 很高兴看到您使用 cv2 代码的答案。可以分享一下吗?

标签: python opencv background


【解决方案1】:

改变

Nmat = np.array(mat, dtype=np.float32)

Nmat = np.array(mat, dtype=np.uint8)

【讨论】:

  • 不过好像没有减去背景
  • 这可以工作,但是我最终只使用了 cv2 库并解决了问题。
【解决方案2】:

你为什么使用这些行:

thresh = cv.CreateImage(cv.GetSize(img),8,1)

cv.Threshold(img,thresh,100,255,cv.CV_THRESH_BINARY)

?

【讨论】:

  • 您好!欢迎来到 SO,并感谢您的贡献。对原始海报的问题通常应作为问题本身的 cmets 添加,而不是作为答案。
  • thresh 被抛出,不再需要它,我在最终版本中使用 cv2.threshold 来获取二进制格式的图像。
猜你喜欢
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 2020-12-31
  • 2015-01-25
相关资源
最近更新 更多