[OpenCV][Python]判斷物件的形狀

更新於 發佈於 閱讀時間約 1 分鐘

在OpenCV中可以利用 cv2.findContours 判斷物件的形狀,可以通過計算輪廓的某些特徵來實現的。

本文主要利用cv2.arcLength與cv2.approxPolyDP來判斷三角形,正方形,矩形。檢查是否為圓形,則用通過輪廓面積和邊界框面積的比率來判斷。

根據物件的頂點數與比例,可以粗略地判斷形狀。


結果圖

raw-image

利用 cv2.findContours 判斷物件的形狀,可以通過計算輪廓的某些特徵來實現的。常用的方法包括:

  1. 輪廓周長與面積比
    • 可以計算物件的輪廓周長(cv2.arcLength)和面積(cv2.contourArea),再比較兩者的比率來判斷形狀。不同的形狀具有不同的比率。
  2. 形狀近似 (Approximate Contour)
    • 使用 cv2.approxPolyDP 函數,可以將輪廓近似為多邊形。這樣可以判斷該物件是否是三角形、矩形或圓形:如果頂點數為 3,則是三角形。如果頂點數為 4,且邊長接近,則是矩形。如果頂點數超過 5,則可能是圓形。
  3. 圓形檢測
    • 可以使用輪廓面積與邊界框面積的比值來檢測圓形。如果輪廓面積與邊界框面積非常接近,則物件很可能是圓形。

程式範例

import cv2
import numpy as np

# 讀取圖像並轉換為灰階
image = cv2.imread('圖片路徑')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用cv2.findContours來檢測輪廓
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))
for contour in contours:
# 獲取輪廓近似
epsilon = 0.04 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)

# 使用頂點數判斷形狀
if len(approx) == 3:
shape = "Triangle"
elif len(approx) == 4:
# 檢測是否是矩形
(x, y, w, h) = cv2.boundingRect(approx)
aspect_ratio = float(w) / h
if 0.95 <= aspect_ratio <= 1.05:
shape = "Square"
else:
shape = "Rectangle"
else:
# 檢查是否為圓形,通過輪廓面積和邊界框面積的比率判斷
area = cv2.contourArea(contour)
circle_area = np.pi * (radius ** 2)
if 0.8 <= area / circle_area <= 1.2: # 比較輪廓面積與理論圓面積
shape = "Circle"
(x, y), radius = cv2.minEnclosingCircle(contour) #最小外接圓
else:
shape = "Unknown"

# 繪製輪廓和標註形狀
cv2.drawContours(image, [contour], -1, (0, 255, 0), 2)
x, y, w, h = cv2.boundingRect(contour) # 重新計算文字放置的位置
cv2.putText(image, shape, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

cv2.imshow('Shape detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()


判斷形狀部分

接下來的程式碼對每個輪廓進行處理和判斷:

  1. 遍歷每個輪廓
    for contour in contours:
  2. 獲取輪廓近似
    epsilon = 0.04 * cv2.arcLength(contour, True)
    approx = cv2.approxPolyDP(contour, epsilon, True)
    • cv2.arcLength 計算輪廓的周長,並乘以 0.04 來獲得近似精度 epsilon。
    • cv2.approxPolyDP 用於簡化輪廓,將其近似為多邊形,True 表示封閉輪廓。
  3. 形狀判斷
    if len(approx) == 3:
    shape = "Triangle"
    elif len(approx) == 4:
    (x, y, w, h) = cv2.boundingRect(approx)
    aspect_ratio = float(w) / h
    if 0.95 <= aspect_ratio <= 1.05:
    shape = "Square"
    else:
    shape = "Rectangle"
    else:
    • 三角形:如果近似頂點數為 3,則判斷為三角形。
    • 四邊形:計算輪廓的邊界矩形 (x, y, w, h)。計算長寬比 aspect_ratio。如果長寬比接近 1(在 0.95 到 1.05 之間),則判斷為正方形;否則為矩形。
  4. 圓形判斷
    area = cv2.contourArea(contour)
    (x, y), radius = cv2.minEnclosingCircle(contour)
    circle_area = np.pi * (radius ** 2)
    if 0.8 <= area / circle_area <= 1.2:
    shape = "Circle"
    • 輪廓面積:使用 cv2.contourArea 計算當前輪廓的面積。
    • 最小外接圓:使用 cv2.minEnclosingCircle 計算能夠包圍該輪廓的最小圓的圓心 (x, y) 和半徑 radius。
    • 圓形判斷:計算圓的理論面積 circle_area,然後比較輪廓面積與理論圓面積的比率。如果比率在 0.8 到 1.2 之間,則判斷為圓形。
留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
143會員
253內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2025/03/24
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
Thumbnail
2025/03/24
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
Thumbnail
2024/10/11
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
Thumbnail
2024/10/11
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
Thumbnail
2024/10/10
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
Thumbnail
2024/10/10
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
在OpenCV中可以利用 cv2.findContours 判斷物件的形狀,可以通過計算輪廓的某些特徵來實現的。 本文主要利用cv2.arcLength與cv2.approxPolyDP來判斷三角形,正方形,矩形。檢查是否為圓形,則用通過輪廓面積和邊界框面積的比率來判斷。
Thumbnail
在OpenCV中可以利用 cv2.findContours 判斷物件的形狀,可以通過計算輪廓的某些特徵來實現的。 本文主要利用cv2.arcLength與cv2.approxPolyDP來判斷三角形,正方形,矩形。檢查是否為圓形,則用通過輪廓面積和邊界框面積的比率來判斷。
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
先上成果圖,如果是螺母的話就標註 is circle來區分。 簡單的用圖表加文字說明AOI辨識 在此文章的範例中: 影像前處理:色彩空間轉換(灰階) -> 二值化閥值處理 演算法:尋找輪廓 數值判斷:長,寬,面積,周長 圖片來源 程式碼 import cv2 import nu
Thumbnail
先上成果圖,如果是螺母的話就標註 is circle來區分。 簡單的用圖表加文字說明AOI辨識 在此文章的範例中: 影像前處理:色彩空間轉換(灰階) -> 二值化閥值處理 演算法:尋找輪廓 數值判斷:長,寬,面積,周長 圖片來源 程式碼 import cv2 import nu
Thumbnail
介紹OpenCV中的cv2.matchTemplate和cv2.minMaxLoc函數的使用方法和參數,提供程式範例以及相關特徵匹配的詳細介紹,讓讀者對此有更深入的瞭解。
Thumbnail
介紹OpenCV中的cv2.matchTemplate和cv2.minMaxLoc函數的使用方法和參數,提供程式範例以及相關特徵匹配的詳細介紹,讓讀者對此有更深入的瞭解。
Thumbnail
觀看本文將可以學習到如何利用Numpy求得物件的邊緣點,及算出物件的寬跟高。 有詳細的程式邏輯說明,及各函式用法說明。 綠點及紅點則是採樣到的邊界點,比較粗的點是偵測到的最大值 完整程式碼 import cv2 import numpy as np import matplotl
Thumbnail
觀看本文將可以學習到如何利用Numpy求得物件的邊緣點,及算出物件的寬跟高。 有詳細的程式邏輯說明,及各函式用法說明。 綠點及紅點則是採樣到的邊界點,比較粗的點是偵測到的最大值 完整程式碼 import cv2 import numpy as np import matplotl
Thumbnail
瞭解二值化影像的應用和程式語法,包括物體檢測和分割、邊緣檢測、圖像分析和測量、文檔辨識,以及使用cv2.threshold的參數和程式範例。
Thumbnail
瞭解二值化影像的應用和程式語法,包括物體檢測和分割、邊緣檢測、圖像分析和測量、文檔辨識,以及使用cv2.threshold的參數和程式範例。
Thumbnail
廢話不多說,先上成果圖。 成果圖 主要實現方法 1.灰階後利用cv2.Canny找物體的邊緣 2.找物件相對應的直線cv2.HoughLines 3.分類為橫向和垂直的直線角度,求得相對於物件的旋轉角度 4.根據算出的相對應旋轉角度將物件轉正
Thumbnail
廢話不多說,先上成果圖。 成果圖 主要實現方法 1.灰階後利用cv2.Canny找物體的邊緣 2.找物件相對應的直線cv2.HoughLines 3.分類為橫向和垂直的直線角度,求得相對於物件的旋轉角度 4.根據算出的相對應旋轉角度將物件轉正
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News