在這一章當中,html
- 咱們將熟悉OpenCV中的背景減法方法。
背景扣除是許多基於視覺的應用程序中的主要預處理步驟。例如,考慮一些狀況,例如訪客計數器,其中靜態相機拍攝進入或離開房間的訪客數量,或交通相機提取有關車輛等的信息。在全部這些狀況下,首先須要單獨提取人員或車輛。從技術上講,你須要從靜態背景中提取移動的前景。python
若是你只有背景圖像,好比沒有遊客的房間圖像,沒有車輛的道路圖像等,這是一件容易的事情。只需從背景中減去新的圖像。你只能看到前景物體。但在大多數狀況下,您可能沒有這樣的圖像,因此咱們須要從咱們擁有的任何圖像中提取背景。車輛出現陰影時,狀況會變得更加複雜。因爲陰影也在移動,因此簡單的減法將其標記爲前景。它使事情變得複雜。算法
爲此目的引入了幾種算法。OpenCV已經實現了三種很是易於使用的算法。咱們將逐一看到他們。app
這是一個基於高斯混合的背景/前景分割算法。它是在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()
(全部結果都顯示在最後進行比較)。編碼
它也是基於高斯混合的背景/前景分割算法。它基於Z.Zivkovic在2004年的兩篇論文「改進的自適應高斯混合模型用於背景扣除」以及2006年的「用於背景扣除任務的每圖像像素的高效自適應密度估計」。該算法的一個重要特徵是它爲每一個像素選擇適當數量的高斯分佈。(請記住,在最後一種狀況下,咱們在整個算法中採用了K個高斯分佈)。它提供了更好的適應性,適應各類場景因爲照明變化等spa
和前面的狀況同樣,咱們必須建立一個背景減法器對象。在這裏,您能夠選擇是否檢測陰影。若是(默認狀況下是這樣),它會檢測並標記陰影,但會下降速度。陰影將以灰色標記。detectShadows = True
code
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()
(結果給出)
該算法結合了統計背景圖像估計和每像素貝葉斯分割。它由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的結果
BackgroundSubtractorMOG2的結果
灰色區域顯示陰影區域。
BackgroundSubtractorGMG的結果
經過形態學開放消除噪音。
參考:
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_video/py_bg_subtraction/py_bg_subtraction.html
轉載請註明出處!!!