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

posted on 2020-04-01 10:28  我坚信阳光灿烂  阅读(1030)  评论(0编辑  收藏  举报

导航