opencv入门:凸包,利用形状场景算法比较轮廓,轮廓的特征值

凸包

逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形凸包来简化它,凸包和逼近多边形很想,但是是最外层凸起的多边形。凸包指完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形,凸包每一处都是凸的,
在这里插入图片描述
边缘与凸包之间的部分被称为图缺陷,可以用来处理手势识别的问题。

获取凸包

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()

在这里插入图片描述

几何学测试

  1. 检测轮廓是否是凸型的

retval = cv2.isContourConvex( contour ) 返回值是布尔值,True表示轮廓是凸的,contour 是判断的轮廓

在这里插入图片描述
可以看到逼近多边形就不是凸型的

  1. 点到轮廓的距离
    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'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值