close

使用 OpenCV 檢測與簡化多邊形輪廓

本文展示如何使用 OpenCV 檢測圖像中的多邊形輪廓,並使用多邊形近似技術簡化輪廓點。

程式碼範例與註解

# 匯入必要模組
import cv2

# 常量表示輪廓索引
RECT, HEXAGON = 0, 1

# 加載圖像並轉換為灰階
frame = cv2.imread('poly.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
)

# 輸出處理前的點數量
print('=== 處理前')
print('矩形點數量:{}'.format(len(contours[RECT])))
print('六邊形點數量:{}'.format(len(contours[HEXAGON])))

# 使用多邊形近似簡化輪廓
approx_rect = cv2.approxPolyDP(contours[RECT], 30, True)
approx_hex = cv2.approxPolyDP(contours[HEXAGON], 30, True)

# 輸出處理後的點數量
print('=== 處理後')
print('矩形點數量:{}'.format(len(approx_rect)))
print('六邊形點數量:{}'.format(len(approx_hex)))

# 繪製簡化後的輪廓
cv2.drawContours(frame, [approx_rect], -1, (0, 0, 255), 5)
cv2.drawContours(frame, [approx_hex], -1, (0, 0, 255), 5)

# 顯示結果
cv2.imshow('frame', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()

  

程式解析

  • 讀取與灰階轉換: 使用 cv2.imread 加載圖像,並轉換為灰階以便進行邊緣檢測。
  • 邊緣檢測: 使用 cv2.Canny 檢測邊緣,並通過 cv2.dilate 擴展邊緣以強化輪廓。
  • 輪廓檢測: 使用 cv2.findContours 檢測圖像中的輪廓,返回輪廓和層次結構。
  • 多邊形近似: 使用 cv2.approxPolyDP 簡化輪廓點,透過設定容差參數控制近似精度。
  • 繪製簡化後的輪廓: 使用 cv2.drawContours 繪製簡化後的矩形與六邊形輪廓,並以紅色標記。
  • 顯示結果: 使用 cv2.imshow 顯示原圖與簡化後的輪廓,方便對比檢測效果。

結論

本程式展示了如何使用 OpenCV 檢測多邊形輪廓,並透過多邊形近似技術簡化點數。這種方法適用於圖形檢測、形狀識別等應用場景,且支持精度控制以適應不同需求。

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

    劉老師的跨域創想工坊

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