1. 程式人生 > >Python中呼叫OpenCV介面中的高斯混合模型,實現對運動目標的檢測,並保存錄制視訊

Python中呼叫OpenCV介面中的高斯混合模型,實現對運動目標的檢測,並保存錄制視訊

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()





效果圖: