2024-09-27|閱讀時間 ‧ 約 22 分鐘

[OpenCV][Python]計算出物件的最小矩形與旋轉角度

本文主要介紹使用cv2.findContours找到圖像中最大物件的輪廓,再用cv2.minAreaRect取得該輪廓的最小矩形旋轉角度,並將這些資訊印上圖像中的右上角。

結果圖

raw-image

程式範例

import cv2
import numpy as np

# 讀取圖像,並轉為灰階與二值化處理
image = cv2.imread('your_image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 轉為灰階圖像
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 找出圖像中的輪廓
cnts, hir = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 找出最大的輪廓
filtered_contours = max(cnts, key=cv2.contourArea)

# 取得該輪廓的最小包圍矩形及角度
rect = cv2.minAreaRect(filtered_contours) # ((center_x, center_y), (w, h), angle)
box = cv2.boxPoints(rect) # 轉換為4個頂點
# box = np.int0(box) # 將頂點轉換為整數座標 #np 1.24 以下使用
box = np.intp(box)
# 繪製最小包圍矩形
cv2.drawContours(image, [box], 0, (0, 255, 0), 2) # 綠色框,線寬為2

# 取得旋轉矩形的中心點和旋轉角度
(center_x, center_y), (w, h), angle = rect

# 顯示中心點和旋轉角度在圖片上
center_text = f"Center: ({int(center_x)}, {int(center_y)})"
angle_text = f"Angle: {int(angle)} degrees"

# 在圖像上寫入文字
cv2.putText(image, center_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2) # 藍色字體
cv2.putText(image, angle_text, (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2) # 藍色字體

# 顯示結果
cv2.imshow("Image with Min Area Rect and Info", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

重點:

  • filtered_contours = max(cnts, key=cv2.contourArea)
    max 函數根據輪廓面積 (cv2.contourArea) 找出最大的輪廓,並將其儲存為 filtered_contours
  • cv2.minAreaRect根據計算出最小包圍矩形,並傳回其參數(center, (w, h), angle),分別是矩形的中心座標寬高旋轉角度
  • cv2.boxPoints轉換為對應的四個頂點。



進一步的應用,可以假設一些條件設定,從圖像中標註自己想要標註的物件。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.