Day17 偵測移動物體
先看看程式的效果
今天的程式示範了如何使用 Python 的 OpenCV 函式庫進行實時影像處理,特別是運動檢測。通過從攝影機捕獲影像,程式碼能夠識別並標示出影像中的運動物體,這在安全監控、智能家居及其他自動化應用中具有廣泛的應用潛力。
Today’s program demonstrates how to use the OpenCV library in Python for real-time image processing, particularly motion detection. By capturing images from a camera, the code can identify and mark moving objects in the images, which has broad application potential in security monitoring, smart homes, and other automation applications.
學習目標
學習如何使用 OpenCV 進行影像捕獲和處理。
理解灰階影像和高斯模糊的概念及其在降噪中的應用。
學會如何計算影像幀之間的差異,並使用二值化技術來識別前景。
程式碼
請先下載 “偵測移動物體.py”
請按此下載
'''
Python + AI in 21 days
https://jasonworkshop.com/python
Designed by Jason Workshop
[請勿修改以上內容]
---
預備工作:
首先,請確保已安裝 opencv-python, mediapipe 模組
如不確定可直接在 Windows 的 cmd prompt 執行以下指定
pip install opencv-python mediapipe
'''
# 導入OpenCV函式庫
import cv2
# 可以選擇從視訊檔案或攝影機讀取影像
#cap = cv2.VideoCapture('test.avi') # 從視訊檔案讀取
cap = cv2.VideoCapture(0) # 從攝影機讀取(0代表預設攝影機)
# 初始化背景幀變數
bg = None
# 主要循環
while True:
# 讀取影像幀
# ret: 讀取是否成功的布林值
# frame: 捕獲的影像幀
ret, frame = cap.read()
# 將彩色影像轉換為灰階
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用高斯模糊降噪
# (17, 17)是高斯核的大小,數字越大模糊效果越強
# 0是標準差,讓OpenCV自動計算
gray = cv2.GaussianBlur(gray, (17, 17), 0)
# 如果還沒有設定背景,將第一幀設為背景
if bg is None:
bg = gray
continue
# 計算當前幀與背景的差異
diff = cv2.absdiff(gray, bg)
# 對差異影像進行二值化處理
# 閾值30:像素差異大於30視為前景
# 255:前景像素設為白色(255)
# cv2.THRESH_BINARY:使用二值化處理
diff = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)[1]
# 形態學處理:侵蝕操作
# 用於消除雜訊(小型白點)
diff = cv2.erode(diff, None, iterations=2)
# 形態學處理:膨脹操作
# 用於填補物件中的小洞
diff = cv2.dilate(diff, None, iterations=2)
# 尋找輪廓
# cv2.RETR_EXTERNAL:只檢測最外層輪廓
# cv2.CHAIN_APPROX_SIMPLE:壓縮水平、垂直和對角線段,只保留端點
cnts, hierarchy = cv2.findContours(
diff,
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
# 處理每個找到的輪廓
for c in cnts:
# 過濾掉太小的輪廓(面積小於1000像素)
# 這有助於消除雜訊
if cv2.contourArea(c) < 1000:
continue
# 計算輪廓的外接矩形
# (x,y)是矩形左上角的座標
# w,h 是矩形的寬度和高度
(x, y, w, h) = cv2.boundingRect(c)
# 在原始影像上繪製綠色矩形框
cv2.rectangle(frame, (x,y), (x+w, y+h), (0,255,0), 2)
# 顯示處理後的影像
cv2.imshow("frame", frame)
# 檢查鍵盤輸入
# 等待100毫秒,如果按下ESC鍵(鍵值27),則結束程式
if cv2.waitKey(100) == 27:
# 關閉所有OpenCV視窗
cv2.destroyAllWindows()
break
小小挑戰一下
大家可以嘗試進行一些修改或改良喔! 例如:嘗試改變程式對移動物件的敏感度吧!
明天見!