背景減除(Background Subtraction)是一種用于從視頻序列中提取前景對象的計算機視覺技術。該技術的主要思想是通過建模和維護場景的背景,從而檢測出在不同時間點出現的前景對象。
OpenCV 提供了一些用于背景減除的函數,其中最常用的是 cv2.createBackgroundSubtractorMOG2
。 cv2.createBackgroundSubtractorMOG2
是 OpenCV 中用于創建混合高斯模型的背景減除器的函數。這個函數用于從視頻中提取前景對象,通過對每個像素的灰度值進行建模,以便檢測變化的部分。
下面是 cv2.createBackgroundSubtractorMOG2
函數的基本用法:
cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True)
參數說明:
history
: 用于建模背景的歷史幀數。默認是 500。varThreshold
: 方差閾值,用于判定像素是否屬于前景。默認是 16。detectShadows
: 是否檢測陰影。如果為 True,則會檢測陰影并將其標記為灰色。默認是 True。
以下是一個簡單的示例,演示如何使用 cv2.createBackgroundSubtractorMOG2
進行背景減除:
import cv2# 創建背景減除器
bg_subtractor = cv2.createBackgroundSubtractorMOG2()# 打開攝像頭
cap = cv2.VideoCapture(0)while True:# 讀取當前幀ret, frame = cap.read()# 應用背景減除器,獲取前景掩碼fg_mask = bg_subtractor.apply(frame)# 可選:對前景掩碼進行形態學操作,去除噪音kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))fg_mask = cv2.morphologyEx(fg_mask, cv2.MORPH_OPEN, kernel)# 在原始幀上繪制前景對象result = cv2.bitwise_and(frame, frame, mask=fg_mask)# 顯示原始幀和結果cv2.imshow('Original Frame', frame)cv2.imshow('Foreground Objects', result)# 按下 ESC 鍵退出循環if cv2.waitKey(30) & 0xFF == 27:break# 釋放攝像頭和關閉窗口
cap.release()
cv2.destroyAllWindows()
在這個示例中,我們使用了攝像頭捕捉每一幀,并通過 cv2.createBackgroundSubtractorMOG2
創建了一個背景減除器。然后,通過 bg_subtractor.apply
函數獲取前景掩碼,可選地使用形態學操作進行噪音去除,并在原始幀上繪制前景對象。最后,我們通過 OpenCV 顯示原始幀和結果。按下 ESC 鍵可以退出循環。
請注意,你可以調整背景減除器的參數,例如設置閾值、學習速率等,以滿足特定場景的需求。