Python中呼叫OpenCV介面中的高斯混合模型,實現對運動目標的檢測,並保存錄制視訊
阿新 • • 發佈:2018-12-29
Python中呼叫OpenCV介面中的高斯混合模型(GMM),實現對運動目標的檢測
import numpy as np import cv2 # TODO: 本程式碼使用OpenCV介面中的高斯混合模型,實現對運動目標的檢測 cap = cv2.VideoCapture(0) # 開啟攝像頭 # cap = cv2.VideoCapture("demo.avi") size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) # cap = cv2.VideoCapture("surveillance_demo\\demo.mp4") mog = cv2.createBackgroundSubtractorMOG2() # 定義高斯混合模型物件 mog fourcc1 = cv2.VideoWriter_fourcc(*'XVID') fourcc2 = cv2.VideoWriter_fourcc(*'XVID') out_detect = cv2.VideoWriter('output_detect.avi', fourcc1, 20.0, size) out_bg = cv2.VideoWriter('output_bg.avi', fourcc1, 20.0, size) i = 0 while(1): # 攝像頭正常,進入迴圈體,讀取攝像頭每一幀影象 ret, frame = cap.read() # 讀取攝像頭每一幀影象,frame是這一幀的影象 print(frame.shape) fgmask = mog.apply(frame) # 使用前面定義的高斯混合模型物件 mog 當前幀的運動目標檢測,返回二值影象 gray_frame = fgmask.copy() # 使用 findContours 檢測影象輪廓框,具體原理有論文,但不建議閱讀。會使用即可。 # 返回值:image,輪廓影象,不常用。 cnts,輪廓的座標。 hierarchy,各個框之間父子關係,不常用。 image, cnts, hierarchy = cv2.findContours(gray_frame, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 繪製每一個 cnts 框到原始影象 frame 中 for c in cnts: if cv2.contourArea(c) < 900: # 計算候選框的面積,如果小於1500,跳過當前候選框 continue (x, y, w, h) = cv2.boundingRect(c) # 根據輪廓c,得到當前最佳矩形框 cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2) # 將該矩形框畫在當前幀 frame 上 cv2.rectangle(image, (x, y), (x + w, y + h), (255, 255, 255), 2) # 將該矩形框畫在當前幀 frame 上 cv2.imshow("contours", frame) # 顯示當前幀 cv2.imshow("fgmask", image) # 顯示運動前景影象 image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) print(image.shape) print(frame.shape) out_detect.write(frame) out_bg.write(image) cv2.waitKey(20) i = i+1 # if cv2.waitKey(int(1000 / 12)) & 0xff == ord("q"): # 可以不用看,這是cv提供的中斷機制 # break cap.release() # 釋放候選框 out_detect.release() out_bg.release() cv2.destroyAllWindows()
效果圖: