close
使用 Picamera2 和 OpenCV 實現顏色檢測與物體追蹤
本教學展示如何使用 Picamera2
與 OpenCV 進行顏色檢測,並追蹤指定顏色的物體。
程式碼範例與註解
# 匯入必要模組
import cv2
import numpy as np
from picamera2 import Picamera2
# 定義顏色範圍 (HSV)
color = ((16, 59, 0), (47, 255, 255)) # 範例範圍
lower = np.array(color[0], dtype="uint8")
upper = np.array(color[1], dtype="uint8")
# 初始化 Picamera2
picam2 = Picamera2()
picam2.configure(picam2.create_preview_configuration(main={"format": "RGB888", "size": (640, 480)}))
picam2.start()
# 設定影像尺寸
WIDTH = 400
HEIGHT = int(WIDTH * (480 / 640)) # 維持比例
# 持續捕捉影像
while True:
# 捕捉畫面並調整尺寸與方向
frame = picam2.capture_array()
frame = cv2.resize(frame, (WIDTH, HEIGHT))
frame = cv2.flip(frame, 1)
# 轉換為 HSV 並進行高斯模糊
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
hsv = cv2.GaussianBlur(hsv, (11, 11), 0)
# 根據顏色範圍生成掩碼
mask = cv2.inRange(hsv, lower, upper)
mask = cv2.erode(mask, None, iterations=2)
mask = cv2.dilate(mask, None, iterations=2)
# 在掩碼中尋找輪廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if contours:
# 選擇最大輪廓
cnt = max(contours, key=cv2.contourArea)
if cv2.contourArea(cnt) < 100:
continue # 忽略小輪廓
# 繪製邊框
x, y, w, h = cv2.boundingRect(cnt)
p1 = (x - 2, y - 2)
p2 = (x + w + 4, y + h + 4)
cv2.rectangle(frame, p1, p2, (0, 255, 255), 2)
# 高亮顯示目標
out = cv2.bitwise_and(hsv, hsv, mask=mask)
cv2.rectangle(hsv, p1, p2, (0, 255, 255), 2)
cv2.rectangle(out, p1, p2, (0, 255, 255), 2)
# 合併結果
frame = cv2.hconcat([frame, hsv, out])
# 顯示畫面
cv2.imshow("frame", frame)
# 按下 'Esc' 鍵退出
if cv2.waitKey(1) == 27:
break
# 清理資源
cv2.destroyAllWindows()
picam2.stop()
程式解析
- 定義 HSV 範圍: 使用 HSV 色彩空間指定要檢測的顏色範圍,以準確過濾目標物體。
- 初始化相機: 使用
Picamera2
捕捉畫面,並設定尺寸為640x480
。 - 影像處理:
- 將 RGB 畫面轉換為 HSV 色彩空間。
- 應用高斯模糊平滑影像。
- 生成二值化掩碼以過濾目標顏色。
- 輪廓檢測與物體標記: 使用
cv2.findContours
檢測目標輪廓,並繪製矩形框標記最大輪廓。 - 視覺化結果: 合併原始畫面、HSV 空間與目標物體的高亮掩碼,實現直觀顯示。
- 退出條件: 按下
Esc
鍵結束程式,釋放資源。
結論
該程式利用 Picamera2
捕捉畫面,結合 OpenCV 的 HSV 篩選與輪廓檢測,實現指定顏色的物體追蹤。用戶可以通過調整 HSV 範圍適配不同場景與應用需求。
全站熱搜