我想從視頻中提取背景圖像,以便我可以檢測其中的移動對象。 我找到了像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")
如果使用使用cv2版本的opencv函數,它們已經是numby數組了 –
Thx,這很有用,我已經用庫中的cv2函數重寫了代碼,並且所有的工作都已經完成! 當然,由於我錯過了某些方法的使用,所以在代碼中進行了很少的修改。 –
用cv2代碼看到你的答案會很高興。你可以分享嗎? – rolnn