[OpenCV應用][Python]利用findContours找出物件邊界框求出寬度及高度

2024/01/15閱讀時間約 4 分鐘

本文將利用OpenCV的findContours函式,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度。

一般來說,我們在進行輪廓檢測時,會先進行圖像二值化,將對象轉換為白色背景為黑色。這樣,在找到輪廓後,輪廓的點就會以白色表示,背景為黑色。

結果圖

從圖中綠色框為物件的邊界框,由邊界框取得寬度與高度

結果圖

結果圖

程式碼

import cv2
import numpy as np

# 讀取圖像
image = cv2.imread('image.png')

# 轉換為灰度圖像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 進行閾值處理或其他圖像預處理操作,以便得到二值圖像
_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 尋找圖像中的輪廓
contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(contours)
# 循環遍歷所有輪廓
for contour in contours:
# 計算包圍輪廓的最小矩形
x, y, w, h = cv2.boundingRect(contour)

# 繪製矩形框
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 輸出寬度和高度
print(f"寬度: {w}, 高度: {h}")

# 顯示結果圖像
cv2.imshow('Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

程式碼解說

contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

回傳的是白色像素點的座標,已(X.Y)列表的形式回傳

cv2.findContours 函數用於尋找二值圖像中的輪廓。

threshold 是二值圖像,即將圖像轉換為黑白兩色。

cv2.RETR_EXTERNAL 參數表示只檢測最外層的輪廓。cv2.CHAIN_APPROX_SIMPLE 參數表示只保留輪廓的端點坐標,節省內存。循環遍歷所有輪廓:

回傳的白色像素點的座標

儲存了左上,左下,右上,右下四個點的列表(list)。

找到的輪廓端點

找到的輪廓端點

對應到圖像中的位子

(在OpenCV 圖像中的座標(x,y)表示),但numpy(y,x)所以在做索引切片時要注意

raw-image

numpy是(y,x)

若搞混這兩者的關係,會造成應用上許多的麻煩。

raw-image

補充語法

contours, _ = cv2.findContours(image, mode, method)

contours 回傳的是依白色像素點的座標儲存的列表image : 圖像

mode: 輪廓檢索演算法

cv2.RETR_EXTERNAL:只檢測外層輪廓。

cv2.RETR_LIST:檢測所有輪廓並存在列表。

cv2.RETR_CCOMP:檢測所有輪廓,並組織成兩層層次結構。

cv2.RETR_TREE:檢測所有輪廓,並組織成樹狀結構。

method:輪廓近似演算法

以行動支持創作者!付費即可解鎖
本篇內容共 1674 字、2 則留言,僅發佈於[Python][OpenCV]學習心得筆記你目前無法檢視以下內容,可能因為尚未登入,或沒有該房間的查看權限。
49會員
88內容數
Python程式設計師,不是在學習就是在學習的路上
留言0
查看全部
發表第一個留言支持創作者!