python opencv 缺陷检测_opencv python 轮廓/凸缺陷/PointPolygonTest/形状匹配

1 凸缺陷

对象上的任何凹陷都被成为凸缺陷.cv.convexityDefects()

hull = cv2.convexHull(cnt,returnPoints = False)

defects = cv2.convexityDefects(cnt,hull)

它返回一个数组,其中每一行包含这些值 - [起点,终点,最远点,到最远点的近似距离]

NOTE:

必须在找到凸包时传递returnPoints = False,以便找到凸起缺陷.

代码:

import cv2

import numpy as np

img = cv2.imread('img7.png')

img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(img_gray, 127, 255,0)

im2,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 PointPolygonTest

此功能可查找图像中的点与轮廓之间的最短距离. 当点在轮廓外时返回负值,当点在内部时返回正值,如果点在轮廓上则返回零.

我们可以检查点(50,50)如下:

dist = cv2.pointPolygonTest(cnt,(50,50),True)

在函数中,第三个参数是measureDist。 如果为True,则查找签名距离. 如果为False,则查找该点是在内部还是外部或在轮廓上(它分别返回+1,-1,0)

NOTE

果您不想找到距离,请确保第三个参数为False,因为这是一个耗时的过程. 因此,将其设为False可提供2-3倍的加速.

3 形状匹配

OpenCV附带了一个函数cv2.matchShapes(),它使我们能够比较两个形状或两个轮廓,并返回一个显示相似性的度量。 结果越低,匹配就越好.它是根据hu-moment值计算的.

代码:

import cv2

import numpy as np

img = cv2.imread('img7.png',0)

img2 = cv2.imread('img9.png',0)

ret, thresh = cv2.threshold(img, 127, 255,0)

ret, thresh2 = cv2.threshold(img2, 127, 255,0)

im2,contours,hierarchy = cv2.findContours(thresh,2,1)

cnt1 = contours[0]

im2,contours,hierarchy = cv2.findContours(thresh2,2,1)

cnt2 = contours[0]

ret = cv2.matchShapes(cnt1,cnt2,1,0.0)

print( ret )

输出:

0.09604402805803886

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值