使用Python,OpenCV从静态背景中提取移动前景
使用Python,OpenCV從靜態背景中提取移動前景
- 1. 效果圖
- 2. 原理
- 3. 源碼
- 參考
這篇博客將介紹OpenCV中的背景減法方法——即從靜態背景中提取移動前景。在許多基于視覺的應用中,背景減法是一個主要的預處理步驟。
例如考慮像訪客柜臺這樣的情況,其中靜態攝像頭記錄進出房間的訪客數量,或者交通攝像頭提取有關車輛的信息等。在所有這些情況下,首先需要單獨提取人或車輛。從技術上講需要從靜態背景中提取移動前景。
OpenCV3.0開始提供了1、2、3個方法,OpenCV4.0后減少了1、3方法,增加了4,只支持2、4倆個方法:cv2.createBackgroundSubtractorMOG2()、cv2.createBackgroundSubtractorKNN();
- BackgroundSubtractorMOG
- BackgroundSubtractorMOG2
- BackgroundSubtractorGMG
- BackgroundSubtractorKNN
1. 效果圖
以OpenCV 4.1. 2.30為例
效果圖分4塊,分別為 法2 不檢測陰影 VS 檢測陰影 VS 法4 不檢測陰影 VS 檢測陰影:
可以看出 不檢測陰影與檢測陰影,基本無差別;
KNN檢測到的背景要比MOG檢測到的陰影更清晰一些
噪音少一些,效果圖2如下:
2. 原理
OpenCV3.0開始提供了1、2、3個方法,OpenCV4.0后減少了1、3方法,增加了4,只支持2、4;
1. BackgroundSubtractorMOG
它是一種基于高斯混合的背景/前景分割算法。它使用一種方法通過混合 K 高斯分布對每個背景像素進行建模( K = 3 到 5)。混合物的權重表示這些顏色留在場景中的時間比例。可能的背景顏色是那些保持更長時間和更靜態的顏色。
首先使用函數 cv2.createBackgroundSubtractorMOG() 創建一個背景對象。它有一些可選參數,如歷史長度、高斯混合數、閾值等。它們都設置為一些默認值。然后在視頻循環中,使用 backgroundsubtractor.apply() 方法獲取前景蒙版。
2. BackgroundSubtractorMOG2
它也是一種基于高斯混合的背景/前景分割算法。該算法的一個重要特點是它為每個像素選擇適當數量的高斯分布。由于光照變化等,它可以更好地適應不同的場景。
首先使用函數 cv2.createBackgroundSubtractorMOG2() 創建一個背景減法器對象,可以選擇是否檢測陰影(默認為false,設置detectShadows = True),它會檢測并標記陰影,但會降低速度。陰影將以灰色標記。
3. BackgroundSubtractorGMG
該算法結合了統計背景圖像估計和逐像素貝葉斯分割。它使用前幾個(默認120)幀進行背景建模。它采用概率前景分割算法,使用貝葉斯推理識別可能的前景對象。估計是自適應的;較新的觀察比舊的觀察具有更大的權重以適應可變照明。完成了幾個形態過濾操作,如關閉和打開,以去除不需要的噪聲。在前幾幀中,您將看到一個黑色窗口。最好對結果應用形態學開運算以去除噪聲。
4. BackgroundSubtractorKNN
3. 源碼
# 背景減法
import numpy as np
import cv2cap = cv2.VideoCapture('images/slow_traffic_small.mp4')# 1. BackgroundSubtractorMOG2, 3. BackgroundSubtractorGMG OpenCV4不支持;
# 2. BackgroundSubtractorMOG2
# 4. BackgroundSubtractorKNN
fgbg = cv2.createBackgroundSubtractorMOG2()
fgbg_shadow = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
fgbgKnn = cv2.createBackgroundSubtractorKNN()
fgbgKnn_shadow = cv2.createBackgroundSubtractorKNN(detectShadows=True)while (1):ret, frame = cap.read()if not ret:breakfgmask = fgbg.apply(frame)fgmask_shadow = fgbg_shadow.apply(frame)fgmaskKnn = fgbgKnn.apply(frame)fgmaskKnn_shadow = fgbgKnn_shadow.apply(frame)cv2.imshow('frame VS frame_shadow \n frameKnn VS frameKnn_shadow',np.vstack([np.hstack([fgmask, fgmask_shadow]), np.hstack([fgmaskKnn, fgmaskKnn_shadow])]))cv2.waitKey(0)k = cv2.waitKey(30) & 0xffif k == 27:breakcap.release()
cv2.destroyAllWindows()
參考
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_video/py_bg_subtraction/py_bg_subtraction.html#py-background-subtraction
總結
以上是生活随笔為你收集整理的使用Python,OpenCV从静态背景中提取移动前景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV中的姿势估计及3D效果(3D
- 下一篇: OpenCV中的尺度不变特征变换(SIF