官方文档 – https://docs.opencv.org/3.4.0/d1/d32/tutorial_py_contour_properties.html
x, y, w, h = cv.boundingRect(cnt)
aspect_ratio = float(W)/h
area = cv.contourArea(cnt)
x, y, w, h = cv.boundingRect(cnt)
rect_area = w * h
extent = float(area) / rect_area
area = cv.contourArea(cnt)
hull = cv.convexHull(cnt)
hull_area = cv.contourArea(hull)
solidity = float(area) / hull_area
area = cv.contourArea(cnt)
equi_diameter = np.sqrt(4*area / np.pi)
方向是指向物体的角度。下面的方法也给出了主轴和小轴的长度。
(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))
# pixelpoits = cv.findNoneZero(mask)
这里有两种方法,一种使用Numpy函数,另一种使用OpenCV函数(最后一个注释行)来执行相同的操作。结果也一样,但有一点不同。Numpy给出了(row行,column列)
格式的坐标,而OpenCV给出了(x,y)
格式的坐标。所以答案基本上是互换的。注意,row行=x
和column列=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])