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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。