機器學習進階-背景建模-(幀差法與混合高斯模型) 1.cv2.VideoCapture(進行視頻讀取) 2.cv2.getStructureElement(構造形態學的卷積) 3.cv2.createBackgroundSubtractorMOG2(構造高斯混合模型) 4.cv2.morpholyEx(對圖像進行形態學的變化)


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

  

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM