凸包
逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形凸包来简化它,凸包和逼近多边形很想,但是是最外层凸起的多边形。凸包指完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形,凸包每一处都是凸的,
边缘与凸包之间的部分被称为图缺陷,可以用来处理手势识别的问题。
获取凸包
hull = cv2.convexHull( points[, clockwise[, returnPoints]] )
- hull凸包角点
- clockwise 布尔值,True时,凸包角点将按顺时针方向排序,False就是逆时针排列凸包角点
- returnPoints 布尔值默认True,函数返回凸包角点的 x/y 轴坐标,False时,返回轮廓中凸包角点的索引
看来懂一点PS 还时有用的。。。
凸缺陷
凸包与轮廓之间的部分就是凸缺陷,使用convexityDefects = cv2.convexityDefects( contour, convexhull )
来获取。返回值时凸缺陷点集,是一个数组,每一行包括的值是 [起点,终点,轮廓上距离凸包最远的点,最远点到凸包的近似距离] .另外前三个值都是轮廓点的索引,要到轮廓点中再寻找。参数就是轮廓和凸包。
我那个图不好理解,,,,凸缺陷的点就是两个凸包角点连线,然后轮廓上距离这条线最远的点就是凸缺陷的点
需要注意的是,用 cv2.convexityDefects()计算凸缺陷时,要使用凸包作为参数。在查找该 凸包时,所使用函数cv2.convexHull()的参数 returnPoints 的值必须是 False。
o = cv2.imread('20.jpg')
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)
for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
start = tuple(cnt[s][0]) # 得到的是索引,要再轮廓中选出来
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv2.line(o,start,end,[0,0,255],2)
cv2.circle(o,far,5,[255,0,0],-1)
cv2.imshow('result',o)
cv2.waitKey(0)
cv2.destroyAllWindows()
几何学测试
- 检测轮廓是否是凸型的
retval = cv2.isContourConvex( contour )
返回值是布尔值,True表示轮廓是凸的,contour 是判断的轮廓
可以看到逼近多边形就不是凸型的
- 点到轮廓的距离
retval = cv2.pointPolygonTest( contour, pt, measureDist )
用来计算点到多边形轮廓的最短距离(也就是垂线距离),又叫点和多边形的关系测试。
- contour 轮廓
- pt 待判定的点
- measureDist 布尔值,表示距离的判定方式,True时,表示计算颠倒轮廓的距离,如果再轮廓外返回负值,轮廓上返回0,内部就是正数,False 时,不计算距离,只返回 -1,0,1 表示点相对于轮廓的位置,外,上,内。
A 点再轮廓外,返回的距离时负值。
利用形状场景算法比较轮廓
用矩比较是一种非常有效的办法,但是现在的shape 模块更厉害就是,,,模块中的形状场景算法可以更高效的比较形状
计算形状场景距离
使用 距离 作为形状比较的度量标准,这是因为形状之间的差异值和距离有相似之处。。。深奥的咱也不懂。。
retval = cv2.createShapeContextDistanceExtractor( [, nAngularBins[, nRadialBins[, innerRadius[, outerRadius[, iterations[, comparer[, transformer]]]]]]] )
使用这个函数计算形状场景距离,使用 形状上下文算法,在每个点上附加一个“形状上下文”描述符,让每个点都能够捕获剩余点相对于它的分布特征,从而提供全局鉴别特征。。。哈哈
返回结果可以通过retval=cv2.ShapeDistanceExtractor.computeDistance(contour1, contour2)
计算两个不同形状之间的距离,参数是两个不同的轮廓。
- nAngularBins:为形状匹配中使用的形状上下文描述符建立的角容器的数量。
- nRadialBins:为形状匹配中使用的形状上下文描述符建立的径向容器的数量。
- innerRadius:形状上下文描述符的内半径。
- outerRadius:形状上下文描述符的外半径。
- iterations:迭代次数。
- comparer:直方图代价提取算子。该函数使用了直方图代价提取仿函数,可以直接采用直方图代价提取仿函数的算子作为参数。
- transformer:形状变换参数。.。。这些参数涨涨见识就行。。。
o1 = cv2.imread('18-1.jpg'