OPCV 移動物體檢測

HxxxTENCTION發表於2024-03-17

1.差值法檢測 :

差值法是一種簡單而有效的移動物體檢測技術,適用於監控和實時跟蹤系統。其核心思想是透過比較連續影片幀之間的差異來識別移動物體。


  .1 >差值法原理
差值法的基本原理是比較連續兩幀或多幀影像間的畫素差異。對於靜態背景,相鄰幀間的差異較小,而對於移動物體,由於其位置的變化,相鄰幀間的畫素值會有較大差異。
  .2 >差值法公式
設 I ( x , y , t ) I(x, y, t) I(x,y,t)為在時間 t t t時刻,影像在位置 ( x , y ) (x, y) (x,y)的畫素值。差值法透過計算相鄰兩幀影像的差異來檢測移動物體:


D ( x , y , t ) = ∣ I ( x , y , t ) − I ( x , y , t − 1 ) ∣ D(x, y, t) = |I(x, y, t) - I(x, y, t-1)| D(x,y,t)=∣I(x,y,t)−I(x,y,t−1)∣
其中, D ( x , y , t ) D(x, y, t) D(x,y,t)表示時刻 t t t與時刻 t − 1 t-1 t−1之間在位置 ( x , y ) (x, y) (x,y)的畫素差異。\

程式碼實現:

import cv2

# # 初始化攝像頭
# cap = cv2.VideoCapture(0)
# 讀取影片
cap = cv2.VideoCapture('video.mp4')

# 讀取第一幀
ret, frame1 = cap.read()
gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)

# 定義矩形結構元素
rectangle_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

while True:
    # 讀取下一幀
    ret, frame2 = cap.read()
    if not ret:
        break  # 如果影片結束,跳出迴圈

    gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)

    # 計算兩幀的差異
    diff = cv2.absdiff(gray1, gray2)

    # 二值化以突出差異
    _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
    thresh = cv2.dilate(thresh, rectangle_kernel, iterations=2)  # 膨脹操作,使輪廓更清晰

    # 找出輪廓
    _, contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 識別面積最大的輪廓
    if contours:
        largest_contour = max(contours, key=cv2.contourArea)
        x, y, w, h = cv2.boundingRect(largest_contour)
        cv2.rectangle(frame2, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 用綠色矩形框出

    # 顯示結果
    thresh_img = cv2.merge([thresh, thresh, thresh])
    cv2.imshow('Difference', cv2.hconcat([frame2, thresh_img]))
    # 準備下一次迭代
    gray1 = gray2

    # 按'q'退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 釋放資源
cap.release()
cv2.destroyAllWindows()

相關文章