2012-05-16 52 views
1

我想從視頻中提取背景圖像,以便我可以檢測其中的移動對象。 我找到了像cv2.BackgroundSubtractorMOG()這樣的函數,但是我只是無法讓它工作。 有人有使用它的經驗嗎?使用開放式CV在Python中進行背景提取

我已經創建的對象mog = cv2.BackgroundSubtractorMOG(300,-1,-1,-1)

然後我嘗試mog.apply(Nmat,Nforemat,-1),但似乎沒有工作,我得到以下 錯誤:

......\OpenCV-2.4.0\modules\video\src\bgfg_gaussmix.cpp:117: error: (-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") 
+1

如果使用使用cv2版本的opencv函數,它們已經是numby數組了 –

+0

Thx,這很有用,我已經用庫中的cv2函數重寫了代碼,並且所有的工作都已經完成! 當然,由於我錯過了某些方法的使用,所以在代碼中進行了很少的修改。 –

+0

用cv2代碼看到你的答案會很高興。你可以分享嗎? – rolnn

回答

1

變化

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

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

但是,它似乎並沒有減去背景 – gntoni

+0

這可以工作,但是我最終只使用了cv2庫並解決了問題。 –

-1

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

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

+0

你好!歡迎來到SO,感謝您的貢獻。對於原始海報的問題通常應該作爲對問題本身的評論而添加,而不是作爲答案。 – Ashe

+0

thresh被丟棄了,不再需要它了,我在最終版本中使用cv2.threshold獲取二進制格式的圖像。 –