前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >opencv 9 -- 轮廓 其他操作

opencv 9 -- 轮廓 其他操作

作者头像
wust小吴
发布2019-07-08 18:27:23
8260
发布2019-07-08 18:27:23
举报
文章被收录于专栏:风吹杨柳风吹杨柳

1 凸缺陷

对象上的任何 凹陷 都被成为凸缺陷

OpenCV 中有一个函数 cv.convexityDefect() 可以帮助我们找到凸缺陷。

函数调用如下

代码语言:javascript
复制
hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)

注意:如果要查找凸缺陷,在使用函数 cv2.convexHull 找凸包时, 参数 returnPoints 一定要是 False

它会返回一个数组, 其中每一行包含的值是 [起点,终点,最远的点,到最远点的近似距离]。 我们可以在一张图上显示它。 我们将起点和终点用一条绿线 连接,在最远点画一个圆圈, 要记住的是返回结果的前三个值是轮廓点的索引。 所以我们还要到轮廓点中去找它们

代码语言:javascript
复制
import cv2
import numpy as np

img = cv2.imread('star.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(img_gray, 127, 255,0)
contours,hierarchy = cv2.findContours(thresh,2,1)
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(img,start,end,[0,255,0],2)
     cv2.circle(img,far,5,[0,0,255],-1)
    cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里写图片描述
这里写图片描述

2 Point Polygon Test

求解图像中的一个点到一个对象轮廓的最短距离。如果点在轮廓的外部, 返回值为负。如果在轮廓上,返回值为 0。如果在轮廓内部,返回值为正。 下面我们以点(50,50)为例

代码语言:javascript
复制
dist = cv2.pointPolygonTest(cnt,(50,50),True)

此函数的第三个参数是 measureDist。 如果设置为 True,就会计算最 短距离。 如果是 False,只会判断这个点与轮廓之间的位置关系(返回值为 +1,-1,0)

注意:如果你不需要知道具体距离,建议你将第三个参数设为 False, 这样速 度会提高 2 到 3 倍

3 形状匹配

函数 cv2.matchShape() 可以帮我们比较两个形状或轮廓的相似度。 如 果返回值越小,匹配越好。

它是根据 Hu 矩来计算的

代码语言:javascript
复制
import cv2
import numpy as np
img1 = cv2.imread('star.jpg',0)
img2 = cv2.imread('star2.jpg',0)
ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
contours,hierarchy = cv2.findContours(thresh2,2,1)
cnt2 = contours[0]
ret = cv2.matchShapes(cnt1,cnt2,1,0.0) print ret

结果是: • A 与自己匹配 0.0 • A 与 B 匹配 0.001946 • A 与 C 匹配 0.326911

注意:Hu 矩是归一化中心矩的线性组合,之所以这样做是为了能够获取代表 图像的某个特征的矩函数,这些矩函数对某些变化如缩放,旋转,镜像映射(除 了 h1)具有不变形

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年05月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 凸缺陷
  • 2 Point Polygon Test
  • 3 形状匹配
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档