close
使用 OpenCV 進行背景差分與運動物體檢測
本文展示如何使用 OpenCV 背景差分技術,對影片中的運動物體進行檢測並標記。
程式碼範例與註解
# 匯入 OpenCV 模組
import cv2
# 開啟影片檔案
cap = cv2.VideoCapture('vtest.avi')
bg = None # 初始化背景
# 持續讀取影片幀
while True:
ret, frame = cap.read()
if not ret:
break
# 將畫面轉換為灰階並模糊化
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (17, 17), 0)
# 初始化背景
if bg is None:
bg = gray
continue
# 計算背景差分並進行二值化處理
diff = cv2.absdiff(gray, bg)
diff = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)[1]
diff = cv2.erode(diff, None, iterations=2)
diff = cv2.dilate(diff, None, iterations=2)
# 尋找輪廓
cnts, hierarchy = cv2.findContours(
diff,
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE
)
for c in cnts:
# 忽略小輪廓
if cv2.contourArea(c) < 500:
continue
# 繪製矩形框
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 顯示畫面
cv2.imshow("frame", frame)
if cv2.waitKey(100) == 27: # 按下 ESC 鍵退出
cv2.destroyAllWindows()
break
程式解析
- 影片加載: 使用
cv2.VideoCapture
加載影片檔案'vtest.avi'
。 - 灰階與模糊處理: 將每一幀轉換為灰階,並使用
cv2.GaussianBlur
模糊化,減少影像中的噪聲。 - 背景初始化: 第一幀作為背景圖像,用於後續幀的背景差分運算。
- 背景差分處理: 使用
cv2.absdiff
計算當前幀與背景之間的差分,並經過二值化、腐蝕與膨脹操作,生成清晰的運動物體掩碼。 - 輪廓檢測: 使用
cv2.findContours
尋找掩碼中的輪廓,並用矩形框標記符合條件的目標。 - 顯示結果: 使用
cv2.imshow
顯示處理後的畫面,包含運動物體的檢測框。
結論
本程式使用背景差分技術結合輪廓檢測,實現對影片中運動物體的檢測與標記。透過調整差分閾值與輪廓面積篩選條件,可以適配不同場景與應用需求。
全站熱搜