使用 OpenCV 檢測凸包與凹缺點
本文展示如何利用 OpenCV 的凸包與凹缺點檢測技術,分析圖像中的形狀特徵。
程式碼範例與註解
# 匯入必要模組
import cv2
# 加載圖像並轉換為灰階
frame = cv2.imread('star.png')
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用 Canny 邊緣檢測並進行膨脹處理
edged = cv2.Canny(gray, 50, 150)
edged = cv2.dilate(edged, None, iterations=1)
# 檢測輪廓
contours, hierarchy = cv2.findContours(
edged,
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE
)
# 獲取第一個輪廓並進行多邊形近似
cnt = contours[0]
cnt = cv2.approxPolyDP(cnt, 30, True)
# 計算凸包與凹缺點
hull = cv2.convexHull(cnt, returnPoints=False)
defects = cv2.convexityDefects(cnt, hull)
# 輸出凸點與凹點數量
print('凸點數量:{}'.format(len(hull)))
print('凹點數量:{}'.format(len(defects)))
# 繪製凹缺點與凸包邊界
for i in range(defects.shape[0]):
s, e, f, d = defects[i, 0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv2.line(frame, start, end, (0, 255, 0), 2)
cv2.circle(frame, far, 5, (0, 0, 255), -1)
# 顯示結果
cv2.imshow('frame', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()程式解析
• 讀取與灰階轉換: 使用 cv2.imread 加載圖像,並轉換為灰階以便進行邊緣檢測。
• 邊緣檢測與輪廓提取: 使用 cv2.Canny 檢測邊緣,並通過 cv2.findContours 提取輪廓。
• 多邊形近似: 使用 cv2.approxPolyDP 簡化輪廓點,幫助減少冗餘信息。
• 凸包與凹缺點檢測: cv2.convexHull 計算形狀的凸包,並返回索引。
• cv2.convexityDefects 計算凹缺點,返回開始點、結束點、最遠點及深度。
• 繪製凸包與凹缺點: 使用 cv2.line 繪製凸包邊界,cv2.circle 標記凹缺點。
• 顯示結果: 使用 cv2.imshow 顯示結果,按任意鍵退出視窗。
結論
本程式展示了如何檢測圖像中的凸包與凹缺點,並可視化結果。此方法對於分析形狀特徵(如手勢識別)非常有用,且易於應用於不同圖像處理場景。
劉老師的跨域創想工坊