1. cv2.VideoCapture('test.avi') 進行視頻讀取
參數說明:‘test.avi’ 輸入視頻的地址
2. cv2.getStructureElement(cv2.MORPH_ELLIPSE, (3, 3)) # 構造一個全是1的kernel用於形態學的操作
參數說明:cv2.MORPH_ELLIPSE 生成全是1的kernel,(3, 3)表示size
3.cv2.createBackgroundSubtractorMOG2().apply(image) 對圖像進行混合高斯模型
參數說明:image表示輸入圖片
4.cv2.morpholyEx(image, cv2.MORPH_OPEN, kernel) # 對圖像進行開運算
參數說明:image表示輸入圖片, cv2.MORPH_OPEN 進行開運算,kernel表示卷積核
對於視頻數據,將前景與物體背景進行分開
幀差法:
將連續兩幀的圖像數據進行差分法,即進行相減操作, 如果其相減后的絕對值大於閾值,則像素點變為255, 否則變為0,通過這種方法來找出視頻中運動的物體

混合高斯模型:
將圖像分為3-5個高斯模型,一個像素點來了,如果該像素點離任何一個高斯模型的距離大於其2倍的標准差,則為前景即運動物體,否則則是背景
步驟:第一步:初始各種參數
第二步:使用T幀圖像構造模型,對於第一個幀圖像的第一個像素點,使用u1,σ1構造高斯模型
第三步:對於一個新來的模型,如果該像素在高斯模型3*σ1內,則屬於該高斯模型,對參數進行更新
第四步:如果不滿足該高斯模型,重新建立一個新的高斯模型

代碼:
第一步:使用cv2.VideoCapture() 構造讀取模型
第二步:使用cv2.getStructureElement(cv2.MORPH_ELLIPSE, (3, 3)) # 構造形態學使用的kernel,即np.ones((3, 3), np.uint8)
第三步:構造cv2.createBackgroundSubtractorMOG2() 實例化混合高斯模型
第四步:cap.read()從視頻中讀取文件,並使用model.apply(frame) 使用上混合高斯模型
第五步:使用cv2.morpholyEx(image, cv2.MORPH_OPEN, kernel) 使用開運算進行噪音的去除
第六步:cv2.findCountours找出圖片中的輪廓,對其進行循環
第七步:對於周長大於188的輪廓,使用cv2.boundingRect計算外接矩陣,使用cv2.rectangle畫出外接矩陣,作為人
第八步:使用cv2.imshow()展示圖片,使用cv2.waitkey(150) & 0xff == 27來延長放映的時間
import cv2 import numpy as np # 第一步:使用cv2.VideoCapture讀取視頻 cap = cv2.VideoCapture('test.avi') # 第二步:cv2.getStructuringElement構造形態學使用的kernel kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # 第三步:構造高斯混合模型 model = cv2.createBackgroundSubtractorMOG2() while(True): # 第四步:讀取視頻中的圖片,並使用高斯模型進行擬合 ret, frame = cap.read() # 運用高斯模型進行擬合,在兩個標准差內設置為0,在兩個標准差外設置為255 fgmk = model.apply(frame) # 第五步:使用形態學的開運算做背景的去除 fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_OPEN, kernel) # 第六步:cv2.findContours計算fgmk的輪廓 contours = cv2.findContours(fgmk, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1] for c in contours: # 第七步:進行人的輪廓判斷,使用周長,符合條件的畫出外接矩陣的方格 length = cv2.arcLength(c, True) if length > 188: (x, y, w, h) = cv2.boundingRect(c) cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) # 第八步:進行圖片的展示 cv2.imshow('fgmk', fgmk) cv2.imshow('frame', frame) if cv2.waitKey(150) & 0xff == 27: break cap.release() cv2.destroyAllWindows()

帶方框的原始圖片 進行高斯混合模型的圖片
