影像前處理:色彩空間轉換(灰階) -> 二值化閥值處理
演算法:尋找輪廓
數值判斷:長,寬,面積,周長
import cv2
import numpy as np
def detect_object_properties(image_path):
# 讀取圖片
image = cv2.imread(image_path)
# 將圖片轉換為灰度
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 進行閾值處理或其他前處理步驟(根據需要)
_, thresh = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)
cv2.imwrite('./thresh.png',thresh)
# 找到輪廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍歷每個輪廓
for contour in contours:
# 計算輪廓的長度、寬度、面積
x, y, w, h = cv2.boundingRect(contour)
area = cv2.contourArea(contour)
if area > 50:
# 判斷是否為圓形
perimeter = cv2.arcLength(contour, True) #得到周長
if perimeter:
# 圓形的相似度 公式
circularity = 4 * np.pi * area / (perimeter * perimeter)
is_circle = circularity >= 0.70 # 調整此閾值根據需要
# 在原始圖像上繪製輪廓及其特徵
cv2.drawContours(image, [contour], -1, (0, 255, 0), 2)
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 在物體上標註長度、寬度、面積等信息
cv2.putText(image, f'Area: {area:.2f}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
cv2.putText(image, f'Width: {w}', (x, y - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
cv2.putText(image, f'Height: {h}', (x, y - 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
if is_circle:
cv2.putText(image, f'Is circle: {is_circle}', (x, y - 70), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
# 顯示結果圖像
cv2.imshow('Object Detection', image)
cv2.imwrite('./out.png',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 呼叫函式進行物體辨識
image_path = './111.jpg' # 替換為你的圖片路徑
detect_object_properties(image_path)
衡量一個輪廓或形狀是否接近於圓形。
接近於圓形的形狀擁有以下特點:
利用此特性:
理想的圓形的周長 P和面積 A之間有一定的比例關係,即 P^2 / A 應該接近於一個固定的值,這個值等於 4π。
根據以上資訊就可以反推出圓形的相似度為以下公式,越接近1,越像圓。
# 圓形的相似度
circularity = 4 * np.pi * area / (perimeter * perimeter)