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 顯示處理後的畫面,包含運動物體的檢測框。

結論

本程式使用背景差分技術結合輪廓檢測,實現對影片中運動物體的檢測與標記。透過調整差分閾值與輪廓面積篩選條件,可以適配不同場景與應用需求。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 liusming 的頭像
    liusming

    劉老師的跨域創想工坊

    liusming 發表在 痞客邦 留言(0) 人氣()