天天看點

Opencv實戰之前景背景分割無參數機率密度估計KNN算法

import cv2 as cv
import numpy as np
# 相關函數
# cv.VideoCapture() 初始化攝像頭,0開啟第一個攝像頭,1開啟第2個攝像頭,傳回攝像頭對象,一般會自動打開攝像頭
# cap.read()    讀取攝像頭幀,傳回值1表示是否成功讀取幀,傳回值2表示該幀
# cv.cvtColor(frame,mode)   轉換圖檔的色彩空間
# cap.release() 關閉攝像頭
# cap.isOpened()    檢查攝像頭是否打開
# cap.open()    打開攝像頭
# cap.get(propld)   獲得該幀的大小
# cap.set(propld,value) 設定該幀的大小

video = cv.VideoCapture(0,cv.CAP_DSHOW)
# 設定編碼格式
# MP4
# fourcc = cv.VideoWriter_fourcc(*"mp4v")
# avi
# fourcc_2 = cv.VideoWriter_fourcc(*'XVID')
# out_video = cv.VideoWriter('output.mp4',fourcc, 20.0, (640,480))
# out_video_2 = cv.VideoWriter('ori.avi',fourcc, 20.0, (640,480))
# 背景減法器 基于自适應混合高斯背景模組化的背景減除法
# history:用于訓練背景的幀數,預設為500幀,如果不手動設定learningRate,history就被用于計算目前的learningRate,此時history越大,learningRate越小,背景更新越慢;
# varThreshold:方差門檻值,用于判斷目前像素是前景還是背景。一般預設16,如果光照變化明顯,如陽光下的水面,建議設為25,36,具體去試一下也不是很麻煩,值越大,靈敏度越低;
# detectShadows:是否檢測影子,設為true為檢測,false為不檢測,檢測影子會增加程式時間複雜度,如無特殊要求,建議設為false

backsub = cv.createBackgroundSubtractorKNN(history=500,dist2Threshold=16,detectShadows=True)
while True:
    # ret 讀取狀态,frame image data
    ret,frame = video.read()
    # 擷取掩碼
    if ret:
        mask = backsub.apply(frame)
        # print(frame.shape)
        # print(mask.shape)
        # 擴充次元
        # mask = np.expand_dims(mask,axis=2).repeat(3,axis=2)
        # out_video.write(mask)
        # out_video_2.write(frame)
        # 膨脹一下
        mask = cv.dilate(mask,kernel=None,dst=3)
        # 任務最大輪廓提取
        cnts,_ = cv.findContours(mask,cv.RETR_CCOMP,cv.CHAIN_APPROX_SIMPLE)
        cv.imshow("frame",mask)
    if cv.waitKey(30) & 0xFF ==ord('q'):
        break
#     釋放資源
video.release()
# out_video.release()
# out_video_2.release()
cv.destroyAllWindows()      

繼續閱讀