opencv 凹凸检测,opencv缺陷检测常用方法

  opencv 凹凸检测,opencv缺陷检测常用方法

  本文主要为大家介绍OpenCV凸包检测和凸缺陷学习实例。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  00-1010 1.凸包检测和凸缺陷的定义2。opencv相关实现函数3。代码练习4。总结。

  

目录

 

  凸包是连接最外面的点形成的凸多边形,可以包含点击中的所有点。目标凸包检测常用于目标识别、手势识别和边界检测等领域。

  轮廓分析后经常使用凸包检测。对二值图像进行轮廓分析后,可以构造每个轮廓的凸包,构造后将返回凸包中包含的点集。根据返回的凸包点集,可以绘制轮廓对应的凸包。一般来说,凸曲线总是凸的,至少是平的。如果有凹进去的地方,就叫凸缺陷。

  凸包和凸缺陷的定义可以在下图中更直接的理解:

  

1、凸包检测与凸缺陷定义

 

  OpenCV提供了凸包函数来检测物体轮廓的凸包,提供了凸包缺陷函数来检测凸起缺陷。让我们先了解一下每个参数的含义:

  hull=cv2.convexHull(点,顺时针,返回点)

  每个参数的含义:

  点:输入轮廓点集。

  顺时针:方向标志。如果设置为True,则输出凸包为顺时针方向;否则,就是逆时针方向。

  ReturnPoints:是否返回点集。

  Hull :输出凸包结果。当参数returnPoints为真时,返回的凸包的顶点坐标是一个点集;如果returnPoints为false,则返回对应于凸包点的轮廓上的点所对应的索引。

  下面的函数可以帮助我们找到凸缺陷:

  凸度缺陷=cv2 .凸度缺陷(轮廓,凸度壳)

  注意:

  执行凸检测时,凸包检测中的返回点应设置为False。

  凸缺陷返回一个数组。每一行都包含诸如起点、终点、最远点以及到最远点的近似距离等值。返回的前三个点是轮廓索引。

  Contour:检测到的轮廓可以通过调用findContours函数获得。

  凸包:检测到的凸包可以通过调用凸包函数得到。

  凸度缺陷:输出参数,检测到的最终结果,返回一个数组,其中每行包含[起点,终点,最远点,到最远点的近似距离]的值。前三点都是大纲索引。

  前三种含义分别是:凸缺陷的起点,凸缺陷的终点,凸缺陷的最深点(即边缘点与凸包距离最大的点)。

  

2、opencv相关实现函数

 

  我们可以在图上显示轮廓的凸包和凸缺陷。

  我们用红线把起点和终点连起来,在最远的点上画一个蓝色的圆。请记住,返回结果的前三个值是轮廓点的索引。所以我们必须在大纲要点中寻找它们。

  前三种含义分别是:凸缺陷的起点,凸缺陷的终点,凸缺陷的最深点(即边缘点到凸包距离最大的点)。

  凸包检测和凸缺陷检测的代码如下:

  #凸包检测和凸缺陷

  将cv2作为cv导入

  #阅读图像

  src1=cv.imread(000.jpg )

  #转换为灰度图像

  gray=cv.cvtColor(src1,cv。COLOR_BGR2GRAY)

  #二值化

  ret,binary=cv.threshold(gray,0,255,cv。THRESH_BINARY cv。OTSU)

  #获取结构元素

  k=cv.getStructuringElement(cv。墨菲_RECT,(3,3))

  #运行中

  binary=cv.morphologyEx(binary,cv。MORPH_OPEN,k)

  #轮廓发现

  轮廓,层次=cv.findContours(二进制,cv。RETR _外部,cv。CHAIN_APPROX_SIMPLE)

  #在原图上画出轮廓,方便与凸包对比,发现凸起缺陷。

  cv.drawContours(src1,Contours,-1,(0,

  225, 0), 3)

  for c in range(len(contours)):

   # 是否为凸包

   ret = cv.isContourConvex(contours[c])

   # 凸缺陷

   # 凸包检测,returnPoints为false的是返回与凸包点对应的轮廓上的点对应的index

   hull = cv.convexHull(contours[c], returnPoints=False)

   defects = cv.convexityDefects(contours[c], hull)

   print(defects, defects)

   for j in range(defects.shape[0]):

   s, e, f, d = defects[j, 0]

   start = tuple(contours[c][s][0])

   end = tuple(contours[c][e][0])

   far = tuple(contours[c][f][0])

   # 用红色连接凸缺陷的起始点和终止点

   cv.line(src1, start, end, (0, 0, 225), 2)

   # 用蓝色最远点画一个圆圈

   cv.circle(src1, far, 5, (225, 0, 0), -1)

  # 显示

  cv.imshow("result", src1)

  cv.waitKey(0)

  cv.destroyAllWindows()

  

  凸缺陷的部分输出:前三个为凸缺陷的起始点,凸缺陷的终点,凸缺陷的最深点(即边缘点到凸包距离最大点)。凸包检测输出的也是轮廓上的点的索引。

  

 

  凸缺陷检测的效果图:

  红色为凸包,蓝色点为凸缺陷的最深点(即边缘点到凸包距离最大点),绿色是轮廓。红色与绿色之间的区域即为凸缺陷。

  

 

  

 

  

4、总结

 

  (1)cv2.convexityDefect函数进行凸缺陷检测时,凸包检测函数中cv2.convexHull中的returnPoints要设置为False,返回轮廓中与凸包点对应的轮廓点的index。

  (2)cv2.convexityDefect函数的返回值是一系列数组,[凸缺陷的起点,凸缺陷的终点,凸缺陷的最深的点,到最远点的近似距离],前三个是索引值,终点和起点连接即得到凸包。

  (3)凸缺陷的最深的点:即边缘点到凸包距离最大点到最远点的近似距离:边缘点到凸包的最大距离。

  (4)利用凸包检测可以得到进一步的轮廓信息,可进行边界检测,结合凸缺陷可以实现手势识别和物体识别。

  以上就是OpenCV凸包检测和凸缺陷学习示例的详细内容,更多关于OpenCV凸包检测和凸缺陷的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • opencv图像识别数字,opencv 识别
  • opencv图像识别数字,opencv 识别,如何基于opencv实现简单的数字识别
  • opencv图像的旋转角度计算,opencv图像仿射变换
  • opencv图像的旋转角度计算,opencv图像仿射变换,OpenCV图像几何变换之透视变换
  • opencv图像的旋转角度计算,opencv 旋转任意角度
  • opencv图像的旋转角度计算,opencv 旋转任意角度,opencv图片的任意角度旋转实现示例
  • opencv图像处理函数,opencv图像轮廓合并
  • opencv图像处理函数,opencv图像轮廓合并,OpenCV图像处理之七种常用图像几何变换
  • opencv双线性插值函数,opencv 图像插值
  • LBPH人脸识别,基于opencv的人脸识别技术
  • LBPH人脸识别,基于opencv的人脸识别技术,Opencv LBPH人脸识别算法详解
  • ,,OpenCV黑帽运算(BLACKHAT)的使用
  • opencv双线性插值函数,opencv 图像插值,C++ OpenCV实现图像双三次插值算法详解
  • ,,C语言 OpenCV实现柱面投影
  • ,,C++ Opencv imfill孔洞填充函数的实现思路与代码
  • 留言与评论(共有 条评论)
       
    验证码: