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 顯示結果,按任意鍵退出視窗。

結論

本程式展示了如何檢測圖像中的凸包與凹缺點,並可視化結果。此方法對於分析形狀特徵(如手勢識別)非常有用,且易於應用於不同圖像處理場景。

arrow
arrow
    創作者介紹
    創作者 liusming 的頭像
    liusming

    劉老師的跨域創想工坊

    liusming 發表在 痞客邦 留言(0) 人氣()