opencv 凸包讲解及绘制
凸包讲解
凸包跟多边形逼近很像,只不过它是物体最外层的”凸”多边形:集合A内连接任意两个点的直线都在A的内部,则称集合A是凸形的。如下图,红色的部分为手掌的凸包,双箭头部分表示凸缺陷(Convexity Defects),凸缺陷常用来进行手势识别等:
opencv中凸包函数
# cnt:轮廓;hull:返回的凸包的角点坐标;reuturnPoints=True:代表返回角点的x/y坐标
hull = cv.convexHull(cnt, returnPoints=True)
绘制凸包
import cv2 as cv
import numpy as np
# 凸包
# 1.先找到轮廓
img = cv.imread('convex.jpg', 0)
_, thresh = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
contours, hierarchy = cv.findContours(thresh, 3, 2)
cnt = contours[0]
# 2.寻找凸包,得到凸包的角点
hull = cv.convexHull(cnt)
# 3.绘制凸包
image = cv.cvtColor(img, cv.COLOR_GRAY2BGR)
cv.polylines(image, [hull], True, (0, 0, 255), 2)
cv.imshow('convex hull', image)
cv.waitKey(0)
cv.destroyAllWindows()
其中函数 cv.convexHull() 有个可选参数returnPoints,默认是True,代表返回角点的x/y坐标;如果为False的话,表示返回轮廓中是凸包角点的索引,比如说:
print(hull[0]) # [[362 184]](坐标)
hull2 = cv.convexHull(cnt, returnPoints=False)
print(hull2[0]) # [510](cnt中的索引)
print(cnt[510]) # [[362 184]]
当使用 cv.convexityDefects() 计算凸包缺陷时,returnPoints需为False。
判断轮廓是否是凸形的
print(cv.isContourConvex(hull)) # True