资讯专栏INFORMATION COLUMN

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

Jensen / 3873人阅读

Contours : More Functions

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42026.html

相关文章

  • opencv python 轮廓特征/包/外接矩形/外接圆/拟合矩形/拟合直线/拟合圆

    摘要:因此,边界矩形的面积不会最小设,为矩形的左上角坐标,,为宽度和高度代码最小外接矩形返回一个结构,其中包含以下,,,,画上述矩形代码最小封闭圈拟合椭圆拟合直线 Contour Features 1 图像的矩 cv2.moments()图像的矩可以帮助计算物体的某些特征,如对象的质心,对象的区域等. 代码: import cv2 import numpy as np img = cv2...

    tulayang 评论0 收藏0
  • opencv python 轮廓的层次结构

    摘要:最后,轮廓是轮廓的子节点,它们位于最后的层次结构级别。即对象的外部轮廓即其边界放置在层次结构中对象内部的孔的轮廓如果有的话放在层次结构中用或标记了轮廓的顺序和它们所属的层次结构它检索所有轮廓并创建完整的族层次结构列表。 Contours Hierarchy 1 层次结构 通常我们使用cv.findContours()函数来检测图像中的对象,有时对象位于不同的位置. 但在某些情况下,某...

    tracymac7 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<