#案例:Fu Xianjun. All Rights Reserved.
一、凸包是什么?
凸包(Convex Hull)是一个计算几何(图形学)中的概念。
在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。X的凸包可以用X内所有点(X1,...Xn)的凸组合来构造.
在二维欧几里得空间中,凸包可想象为一条刚好包著所有点的橡皮圈。
用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点
hull = cv2.convexHull( points[,clockwise[,returnPoints]] ) #获取凸包
import cv2
import numpy as np
img = cv2.imread('contours2.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#阈值处理
ret,binary = cv2.threshold(gray,127,255,0)
#查找轮廓
contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
hull = cv2.convexHull(contours[0])
cv2.polylines(img,[hull],True,(255,255,0),2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.凸包图像缺陷检测
#案例:Fu Xianjun. All Rights Reserved.
import cv2
import numpy as np
img = cv2.imread('binaryhand.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#阈值处理
ret,binary = cv2.threshold(gray,127,255,0)
#查找轮廓
contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#凸包
img1 = img.copy()
hull = cv2.convexHull(contours[0])
cv2.polylines(img1,[hull],True,(0,255,0),2)
print("cv2.convexHull():",cv2.isContourConvex( hull ))
cv2.imshow('img1',img1)
#逼近多边形
img2 = img.copy()
epsilon = 0.01*cv2.arcLength(contours[0],Ture)
approx1 = cv2.approxPolyDP(contours[0],epsilon ,True)#拟合精确度
img1 =cv2.polylines(img2,[approx1],True,(255,255,0),2)
print("cv2.approxPolyDP():",cv2.isContourConvex( approx1 ))
cv2.imshow('approxPolyDP1',img2)
#释放窗口
cv2.waitKey(0)
cv2.destroyAllWindows()