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()