視頻分析(三):背景減法

目標

在這一章當中,html

  • 咱們將熟悉OpenCV中的背景減法方法。

基礎

背景扣除是許多基於視覺的應用程序中的主要預處理步驟。例如,考慮一些狀況,例如訪客計數器,其中靜態相機拍攝進入或離開房間的訪客數量,或交通相機提取有關車輛等的信息。在全部這些狀況下,首先須要單獨提取人員或車輛。從技術上講,你須要從靜態背景中提取移動的前景。python

若是你只有背景圖像,好比沒有遊客的房間圖像,沒有車輛的道路圖像等,這是一件容易的事情。只需從背景中減去新的圖像。你只能看到前景物體。但在大多數狀況下,您可能沒有這樣的圖像,因此咱們須要從咱們擁有的任何圖像中提取背景。車輛出現陰影時,狀況會變得更加複雜。因爲陰影也在移動,因此簡單的減法將其標記爲前景。它使事情變得複雜。算法

爲此目的引入了幾種算法。OpenCV已經實現了三種很是易於使用的算法。咱們將逐一看到他們。app

BackgroundSubtractorMOG 

這是一個基於高斯混合的背景/前景分割算法。它是在P. KadewTraKuPong和R. Bowden於2001年發表的論文「用於實時跟蹤陰影檢測的改進自適應背景混合模型」一文中介紹的。它使用一種方法經過K個高斯分佈的混合對每一個背景像素進行建模( K = 3至5)。混合物的權重表示這些顏色留在場景中的時間比例。可能的背景顏色是保持更長和更靜態的顏色。框架

在編碼時,咱們須要使用函數cv2.createBackgroundSubtractorMOG()建立背景對象。它有一些可選的參數,如歷史長度,高斯混合的數量,閾值等。它們都被設置爲一些默認值。而後在視頻循環中,使用backgroundsubtractor.apply()方法獲取前景蒙板。ide

看一個簡單的例子以下:函數

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')

fgbg = cv2.createBackgroundSubtractorMOG()

while(1):
    ret, frame = cap.read()

    fgmask = fgbg.apply(frame)

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

cap.release()
cv2.destroyAllWindows()

(全部結果都顯示在最後進行比較)。編碼

BackgroundSubtractorMOG2 

它也是基於高斯混合的背景/前景分割算法。它基於Z.Zivkovic在2004年的兩篇論文「改進的自適應高斯混合模型用於背景扣除」以及2006年的「用於背景扣除任務的每圖像像素的高效自適應密度估計」。該算法的一個重要特徵是它爲每一個像素選擇適當數量的高斯分佈。(請記住,在最後一種狀況下,咱們在整個算法中採用了K個高斯分佈)。它提供了更好的適應性,適應各類場景因爲照明變化等spa

和前面的狀況同樣,咱們必須建立一個背景減法器對象。在這裏,您能夠選擇是否檢測陰影。若是(默認狀況下是這樣),它會檢測並標記陰影,但會下降速度。陰影將以灰色標記。detectShadows = Truecode

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')

fgbg = cv2.createBackgroundSubtractorMOG2()

while(1):
    ret, frame = cap.read()

    fgmask = fgbg.apply(frame)

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

cap.release()
cv2.destroyAllWindows()

(結果給出)

BackgroundSubtractorGMG 

該算法結合了統計背景圖像估計和每像素貝葉斯分割。它由Andrew B. Godbehere,Akihiro Matsukawa和Ken Goldberg在2012年發表的論文「可變光線條件下視覺跟蹤人體視覺響應音頻藝術裝置」中介紹。根據該論文,系統運行了成功的交互式音頻藝術裝置於2011年3月31日至31日在加利福尼亞州舊金山當代猶太博物館舉行,名爲「咱們還有嗎?」。

它使用前幾個(默認爲120)幀進行背景建模。它採用機率前景分割算法,使用貝葉斯推斷來識別可能的前景對象。估計是適應性的; 新的觀測值比舊的觀測值具備更大的權重以適應可變照明。幾種形態過濾操做,如關閉和打開,以消除沒必要要的噪音。前幾幀你會看到一個黑色的窗口。

將形態開放應用於結果以消除噪音會更好。

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
fgbg = cv2.createBackgroundSubtractorGMG()

while(1):
    ret, frame = cap.read()

    fgmask = fgbg.apply(frame)
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)

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

cap.release()
cv2.destroyAllWindows()

結果

原始的框架

下圖顯示了視頻的第200幀

原始框架

BackgroundSubtractorMOG的結果

BackgroundSubtractorMOG的結果

BackgroundSubtractorMOG2的結果

灰色區域顯示陰影區域。

BackgroundSubtractorMOG2的結果

BackgroundSubtractorGMG的結果

經過形態學開放消除噪音。

BackgroundSubtractorGMG的結果

 

參考:

http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_video/py_bg_subtraction/py_bg_subtraction.html

轉載請註明出處!!!

相關文章
相關標籤/搜索