在這裡,我們將學習提取一些常用的屬性,如固體,等效直徑,掩模影象,平均強度等。更多功能可以在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...