opencv 中 那些 常用的輪廓屬性和函式

2021-10-24 01:34:34 字數 4530 閱讀 5865

在這裡,我們將學習提取一些常用的屬性,如固體,等效直徑,掩模影象,平均強度等。更多功能可以在matlab的區域道具文件中找到。

它是物件的邊界矩形的寬度與高度的比率。

x,y,w,h = cv.boundingrect(cnt)

aspect_ratio = float(w)/h

extent範圍是指輪廓面積與邊界矩形面積之比。

area = cv.contourarea(cnt)

x,y,w,h = cv.boundingrect(cnt)

rect_area = w*h

extent = float(area)/rect_area

solidity度是輪廓面積與凸包面積之比。

area = cv.contourarea(cnt)

hull = cv.convexhull(cnt)

hull_area = cv.contourarea(hull)

solidity = float(area)/hull_area

equivalent diameter是面積與輪廓面積相同的圓的直徑。

方向是物體指向的角度。下面的方法也給出了主軸和副軸的長度。

(x,y),(ma,ma),angle = cv.fitellipse(cnt)
在某些情況下,我們可能需要包含該物件的所有點。可以這樣做:

mask = np.zeros(imgray.shape,np.uint8)

cv.drawcontours(mask,[cnt],0,255,-1)

pixelpoints = np.transpose(np.nonzero(mask))

#pixelpoints = cv.findnonzero(mask)

這裡給出了兩個方法,乙個使用numpy函式,另乙個使用opencv函式(最後的注釋行)來完成相同的操作。結果也一樣,只是略有不同。numpy以**(行,列)**格式給出座標,opencv以**(x,y)**格式給出座標。所以基本上答案會互換。注意,行= x,列= y。

我們可以使用遮罩影象找到這些引數。

min_val, max_val, min_loc, max_loc = cv.minmaxloc(imgray,mask = mask)
在這裡,我們可以找到乙個物體的平均顏色。或者它可以是物體在灰度模式下的平均強度。我們再次使用相同的蒙版來做這件事。

mean_val = cv.mean(im,mask = mask)
極值點是指物體的最上、最下、最右和最左的點。

leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])

rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])

topmost = tuple(cnt[cnt[:,:,1].argmin()][0])

bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])

例如,如果我應用它到乙個印度地圖,我得到以下結果:

我們在關於輪廓的先前文章中了解了什麼是凸包。凸包和本體的任何偏差都可以認為是凹凸缺陷。

opencv提供了乙個現成的函式來查詢這個問題,即c . convexitydefects()。乙個基本的函式呼叫如下所示:

hull = cv.convexhull(cnt,returnpoints = false)

defects = cv.convexitydefects(cnt,hull)

記住,我們必須通過returnpoints = false來尋找凸包,以找到凸性缺陷。

它返回乙個陣列,其中每一行包含這些值-[起始點,結束點,最遠點,到最遠點的近似距離]。我們可以用影象來表示它。我們畫一條連線起點和終點的線,然後在最遠處畫乙個圓。記住,返回的前三個值是cnt的索引。所以我們必須從cnt中獲取這些值。

此函式查詢影象中點與輪廓線之間的最短距離。當點在輪廓線外時,返回的距離為負,點在輪廓線內時返回的距離為正,點在輪廓線上返回的距離為零。

例如,我們可以檢查點(50,50)如下:

dist = cv.pointpolygontest(cnt,(50,50),true)
double cv::pointpolygontest

(inputarray

contour,

point2f

pt,bool 

measuredist

)python:

retval

=cv.pointpolygontest(

contour, pt, measuredist

)該函式確定點是在輪廓線內、外還是在邊緣上(或與頂點重合)。相應地,它返回正(內部)、負(外部)或零(沿邊)值。當measuredist=false時,返回值分別為+1、-1和0。否則,返回值為該點與最近的輪廓邊之間的有符號距離。 

引數:contour

輸入輪廓

pt點測試輪廓

measuredist

如果為真,函式估計從該點到最近輪廓邊的帶符號距離。否則,函式只檢查點是否在輪廓線內。

opencv附帶了乙個函式cv.matchshapes(),它使我們能夠比較兩個形狀或兩個輪廓,並返回乙個顯示相似性的度量。結果越低,匹配越好。它是基於hu矩值計算的。不同的測量方法在文件中有說明。

我試著用下面給出的不同形狀匹配形狀:

OpenCV中的輪廓發現和輪廓繪製

實現 import cv2 import numpy as np 輪廓發現和輪廓繪製 img是一張與binary類似的二值圖,contours是list列表結構每個元素包含乙個邊沿資訊,heriachy是乙個矩陣,用處作者也未知,可以 contours,heriachy cv2.findcontou...

opencv2中尋找輪廓

最近想嘗試用opencv做專案,發現需要考慮的細節很多,用商業庫用習慣了,有點不適應,慢慢來吧。上網查了查用opencv做連通域運算,發現都是先尋找輪廓,那就先來學習下輪廓。opencv中尋找輪廓的c 函式是 void findcontours inputoutputarray image outp...

OpenCV 輪廓的凸性

一 概括 理解物體形狀或輪廓的另外一種有用的方法是計算乙個物體的凸包 convex hull 然後計算其凸缺陷 convexity defects 很多複雜物體的特性能很好的被這種缺陷表現出來。二 相關函式 1 發現點集的凸外形 cvseq cvconvexhull2 const cvarr inp...