close
使用 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
顯示結果,按任意鍵退出視窗。
結論
本程式展示了如何檢測圖像中的凸包與凹缺點,並可視化結果。此方法對於分析形狀特徵(如手勢識別)非常有用,且易於應用於不同圖像處理場景。
文章標籤
全站熱搜