1

ビデオから背景画像を抽出して、その中の動くオブジェクトを検出できるようにしようとしています。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")
4

2 に答える 2

1

変化する

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

為に

Nmat = np.array(mat, dtype=np.uint8)
于 2012-05-17T20:53:53.620 に答える
-1

これらの行を使用する理由:

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

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

?

于 2012-05-23T16:35:10.780 に答える