使用 OpenCV 進行輪廓檢測與繪製
本教學展示如何利用 OpenCV 從靜態圖像中檢測輪廓,並在畫面上繪製檢測結果。
程式碼範例與註解
# 匯入 OpenCV 模組
import cv2
# 加載靜態圖像
cap = cv2.VideoCapture('coin.jpg')
ret, frame = cap.read()
# 將圖像轉換為灰階並應用高斯模糊
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (13, 13), 0)
# 使用 Canny 邊緣檢測
edged = cv2.Canny(gray, 50, 150)
# 檢測輪廓
contours, hierarchy = cv2.findContours(
edged.copy(),
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE
)
# 繪製輪廓
out = frame.copy()
cv2.drawContours(out, contours, -1, (0, 255, 128), 2)
# 合併原圖與輪廓圖
frame = cv2.hconcat([frame, out])
# 顯示結果
cv2.imshow('frame', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()程式解析
• 讀取圖像: 使用 cv2.VideoCapture 加載圖像檔案,並通過 cap.read() 獲取圖像數據。
• 灰階與模糊化處理: 將圖像轉換為灰階以降低計算複雜度,並應用 cv2.GaussianBlur 平滑影像,減少噪聲干擾。
• 邊緣檢測: 使用 cv2.Canny 檢測邊緣,設定上下閾值分別為 50 和 150。
• 輪廓檢測: 使用 cv2.findContours 從邊緣圖中提取輪廓,並返回輪廓數據和層次結構。
• 繪製輪廓: 在原圖的副本上繪製所有檢測到的輪廓,顏色為綠色 (0, 255, 128),線條厚度為 2。
• 合併與顯示: 使用 cv2.hconcat 將原圖與輪廓圖並排顯示,並通過 cv2.imshow 視覺化結果。
結論
本程式展示了從靜態圖像中檢測輪廓的完整過程,並將檢測結果直觀地繪製在圖像上。用戶可調整 Canny 檢測的閾值或輪廓檢測參數,適配不同場景需求。
劉老師的跨域創想工坊