文章素材来源 Fu Xianjun. All Rights Reserved.
知识储备:凸包的概念
凸包指的是完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形。凸包的每一处都是凸的,即在凸包内连接任意两点的直线都在凸包的内部。在凸包内,任意连续三个点的内角小180°。
知识储备:凸包的获取
- hull=cv2.convexHull(points[,clockwise[,returnPoints]]
- hull:凸包角点。
- clockwise: 布尔值,True时,凸包角点将按顺时针方向排序,False就是逆时针排列凸包角点。
- returnPoints: 布尔值默认True,函数返回凸包角点的 x/y 轴坐标,False时,返回轮廓中凸包角点的索引。
知识储备:凸包的绘制
- cv2.polylines(src, [points], isClosed,color, thickness)
- src:要处理的图像。
- points:点集。
- isClosed:布尔型,True表示的是线段闭合,False表示的是仅保留线段。
- color:线段颜色,格式是(B,G,R)值。
- thickness:数值型,厚度,默认值为1,如果对封闭图形,正方形,三角形等传入-1,则会填充整个图形。
知识储备:凸缺陷的概念
凸包与轮廓之间的部分,称为凸缺陷。轮廓上距离这条线最远的点就是凸缺陷的点。
将图片二值化方便后继操作
img = cv2.imread('hand.png', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
# 图片轮廓
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
n=len(contours) #轮廓个数
contoursImg=[]
x=0 #初始化要绘制的轮廓索引
for i in range(n):
area = cv2.contourArea(contours[i])
if area>10000:
print(f"轮廓{i}的面积:\n{area}")
x=i
cnt = contours[x]
cv2.imshow("binary",binary)
#寻找凸包并绘制凸包(轮廓)
hull = cv2.convexHull(cnt)
cv2.polylines(img,[hull],True,(0,255,0),2)
cv2.drawContours(img,contours,x,(0,0,255), 3)
知识储备:cv2.convexityDefects()函数
convexityDefects = cv2.convexityDefects(contour, convexhul)
contour:轮廓。
convexhull:凸包.