我们要得到一些目标有用的属性,比如当量直径
1.高宽比
这是目标的边界矩形的宽高比
x,y,w,h=cv2.boundingRect(cnt)
aspect_ratio=float(w)/h
2.Extent
Extent是轮廓面积和边界矩形面积的比率
area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area
3.Solidity
是轮廓面积和凸形外壳面积的比率
area = cv2.contourArea(cnt)
hull = cv2.convexHull(cnt)
hull_area = cv2.contourArea(hull)
solidity = float(area)/hull_area
4.等价半径
是面积和轮廓面积一样的圆的半径
area=cv2.contourArea(cnt)
equi_diameter=np.sqrt(4*area/np.pi)
5.方向
目标的方向角度。下面的方法可以得到长轴和短轴长度
(x,y),(MA,ma),angle=cv2.fitEllipse(cnt)
6.
在某些情况下,我们可能需要构成目标的所有点。
mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
#pixelpoints = cv2.findNonZero(mask)
这里,两个方法,一个使用Numpy函数,另一个使用OpenCV函数(最后的注释行)达到同样目的。结果也是相同的。不同的一点是Numpy给的坐标是(row, column)格式,而OpenCV给的坐标是(x, y)格式,所以基本上结果可以互相转换。row = x , column = y
7.最大值,最小值以及他们的位置
参数使用了mask image
min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(imgray,mask=mask)
8.平均颜色和平均强度
我们可以得到目标的平均颜色。或者是灰度模式下的平均亮度。再次使用了mask image
mean_val=cv2.mean(im,mask=mask)
9.端点
端点表示最高点,最低点,最左和最右点。
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])
比如如果是印度地图,会得到下面的结果
END