大部分在求物件的寬度及高度,都會想到用OpenCV的findContours函式來做,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度
[OpenCV應用][Python]利用findContours找出物件邊界框求出寬度及高度
本文將用不同的方法,利用Numpy一樣求出物件的寬度及高度
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)
edge_coordinates = np.column_stack(np.where(threshold > 0))
#取得四個邊的位子
leftmost = np.min(edge_coordinates[:, 1])
topmost = np.min(edge_coordinates[:, 0])
rightmost = np.max(edge_coordinates[:, 1])
bottommost = np.max(edge_coordinates[:, 0])
# 計算長和寬
width = rightmost - leftmost
height = bottommost - topmost
# 繪製矩形框
cv2.rectangle(image, (leftmost, topmost), (rightmost, bottommost), (0, 255, 0), 2)
# 輸出寬度和高度
print(f"寬度: {width}, 高度: {height}")
# 顯示結果圖像
cv2.imshow('Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
此方法應用到Numpy中的where,column_stack,min,max
np.where(condition, [x, y])
:根據條件返回元素位置的索引。np.column_stack(tup)
:將一系列1-D 序列(列表、元組、數組等)按列堆疊以形成一個多列的數組
min :
返回最小值
max :
返回最大值
1. np.where(img > 0)
找出每個非0的索引
2. 利用np.column_stack
推疊出每個非0(y,x)座標
3. 利用Max, Min
找找非0的索引(y,x)座標的最大最小值
4. Max值 – Min值 = 長 或 寬
1. 在圖像中,黑 = 0,白等於255,先將想要偵測的物件利用二值化方法變成白色,在用np.where
方法找到圖片中非0的位子
2. 找到這些非0的位子,實際上就是物件每一個白色的點的位子,利用np.column_stack
把他推疊起來
3. 在圖像中,第一個索引通常對應圖像的垂直軸(y 軸),而第二個索引對應水平軸(x 軸),由此可得知在那推資料中,我若要得到物件的寬,就要知道對應圖像中 最左邊跟最右邊的座標位子
4. 最左邊的座標,從剛推疊白色的座標點的list中,找到X的最小值就是最左邊的,最大值就是最右邊,(最大值 減 最小值) 就得到寬度了
[OpenCV Python應用]遮罩,旋轉,輪廓應用濾除斑點
[OpenCV Python應用]利用SIFT得取圖片物件旋轉角度,並旋轉回正常角度