OpenCV--背景建模


背景建模

幀差法

由於場景中的目標在運動,目標的影像在不同圖像幀中的位置不同。該類算法對時間上連續的兩幀圖像進行差分運算,不同幀對應的像素點相減,判斷灰度差的絕對值,當絕對值超過一定閾值時,即可判斷為運動目標,從而實現目標的檢測功能。幀差法非常簡單,但是會

引入噪音和空洞問題。

 

 混合高斯模型

在進行前景檢測前,先對背景進行訓練,對圖像中每個背景采用一個混合高斯模型進行模擬,每個背景的混合高斯的個數可以自適應。然后在測試階段,對新來的像素進行GMM匹配,如果該像素值能夠匹配其中一個高斯,則認為是背景,否則認為是前景。由於整個過程

GMM模型在不斷更新學習中,所以對動態背景有一定的魯棒性。最后通過對一個有樹枝搖擺的動態背景進行前景檢測,取得了較好的效果。

在視頻中對於像素點的變化情況應當是符合高斯分布

 

 背景的實際分布應當是多個高斯分布混合在一起,每個高斯模型也可以帶有權重

 

 混合高斯模型學習方法

- 1.首先初始化每個高斯模型矩陣參數。

- 2.取視頻中T幀數據圖像用來訓練高斯混合模型。來了第一個像素之后用它來當做第一個高斯分布。

- 3.當后面來的像素值時,與前面已有的高斯的均值比較,如果該像素點的值與其模型均值差在3倍的方差內,則屬於該分布,並對其進行參數更新。

- 4.如果下一次來的像素不滿足當前高斯分布,用它來創建一個新的高斯分布。

混合高斯模型測試方法

在測試階段,對新來像素點的值與混合高斯模型中的每一個均值進行比較,如果其差值在2倍的方差之間的話,則認為是背景,否則認為是前景。將前景賦值為255,背景賦值為0。這樣就形成了一副前景二值圖。

import numpy as np
import cv2

#經典的測試視頻
cap = cv2.VideoCapture('test.avi')
#形態學操作需要使用
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
#創建混合高斯模型用於背景建模
fgbg = cv2.createBackgroundSubtractorMOG2()

while(True):
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    #形態學開運算去噪點
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
    #尋找視頻中的輪廓
    im, contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for c in contours:
        #計算各輪廓的周長
        perimeter = cv2.arcLength(c,True)
        if perimeter > 188:
            #找到一個直矩形(不會旋轉)
            x,y,w,h = cv2.boundingRect(c)
            #畫出這個矩形
            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)    

    cv2.imshow('frame',frame)
    cv2.imshow('fgmask', fgmask)
    k = cv2.waitKey(150) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

效果:


免責聲明!

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



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