上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

【OpenCV学习笔记25】- OpenCV中的轮廓 - 轮廓:更多的功能

guduadmin251月前

这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子,也会给出自己根据官方的例子完成的更改代码,同样彩蛋的实现也会结合多个知识点一起实现一些小功能,来帮助我们对学会的知识点进行结合应用。

如果有喜欢我笔记的请麻烦帮我关注、点赞、评论。谢谢诸位。

学习笔记:

学习笔记目录里面会收录我关于OpenCV系列学习笔记博文,大家如果有什么不懂的可以通过阅读我的学习笔记进行学习。

【OpenCV学习笔记】- 学习笔记目录

内容

  • 凸性缺陷以及如何发现它们。
  • 求点到多边形的最短距离
  • 搭配不同的形状

    理论和代码

    1.凸包缺陷

    在轮廓特征中,我们看到了关于轮廓的凸包。物体与该船体的任何偏离都可以视为凸包缺陷。

    OpenCV带有一个现成的函数 cv2.convexityDefect() 来查找该函数。基本的函数调用如下所示:

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

    注意 请记住,在寻找凸包时,我们必须传递returnPoints = False,以便寻找凸缺陷。

    它返回一个数组,其中每行包含这些值- [起点,终点,最远点,到最远点的近似距离]。我们可以使用图像对其进行可视化。我们画一条连接起点和终点的线,然后在最远的点画一个圆。请记住,返回的前三个值是cnt的索引。因此,我们必须从cnt带来这些值。

    示例代码:

    # OpenCV中的轮廓
    # 轮廓:更多功能
    # 1.凸包缺陷
    import cv2 as cv
    img = cv.imread('../image/3.9.3.png')
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    ret, thresh = cv.threshold(img_gray, 127, 255, 0)
    contours, hierarchy = cv.findContours(thresh, 2, 1)
    cnt = contours[0]
    hull = cv.convexHull(cnt, returnPoints=False)
    defects = cv.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])
        cv.line(img, start, end, [0, 255, 0], 2)
        cv.imshow('img', img)
        cv.waitKey(0)
        cv.circle(img, far, 5, [0, 0, 255], -1)
        cv.imshow('img', img)
        cv.waitKey(0)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    效果图:

    【OpenCV学习笔记25】- OpenCV中的轮廓 - 轮廓:更多的功能,在这里插入图片描述,第1张

    2.点多边形测试

    此功能查找图像中的点与轮廓之间的最短距离。它返回的距离为:当点在轮廓外时为负;当点在轮廓内时为正;如果点在轮廓上,则返回零。

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

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

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

    注意 如果您不想查找距离,请确保第三个参数为False,因为这是一个耗时的过程。因此,将其设置为False可使速度提高2-3倍。

    3.匹配形状

    OpenCV带有函数 cv2.matchShapes(),使我们能够比较两个形状或两个轮廓,并返回显示相似性的度量。结果越低,匹配越好。它是基于 hu-moment 值计算的。文档中介绍了不同的测量方法。

    示例代码:

    # OpenCV中的轮廓
    # 轮廓:更多功能
    # 3.匹配形状
    import cv2 as cv
    img1 = cv.imread('../image/3.9.3-1.png', 0)
    img2 = cv.imread('../image/3.9.3-2.png', 0)
    ret, thresh = cv.threshold(img1, 127, 255, 0)
    ret, thresh2 = cv.threshold(img2, 127, 255, 0)
    contours, hierarchy = cv.findContours(thresh, 2, 1)
    cnt1 = contours[0]
    contours, hierarchy = cv.findContours(thresh2, 2, 1)
    cnt2 = contours[0]
    cnt3 = contours[1]
    cnt4 = contours[2]
    ret = cv.matchShapes(cnt1, cnt2, 1, 0.0)
    print(ret)
    ret = cv.matchShapes(cnt1, cnt3, 1, 0.0)
    print(ret)
    ret = cv.matchShapes(cnt1, cnt4, 1, 0.0)
    print(ret)
    

    原图:

    【OpenCV学习笔记25】- OpenCV中的轮廓 - 轮廓:更多的功能,在这里插入图片描述,第2张

    【OpenCV学习笔记25】- OpenCV中的轮廓 - 轮廓:更多的功能,在这里插入图片描述,第3张

    命令行/控制台输出:

    0.2916606851092495
    0.006417678155163753
    0.0
    

    我得到以下结果:

    • 图像和本身匹配= 0.0
    • 将图像与旋转图匹配= 0.006417678155163753
    • 将图像与其他图像匹配= 0.2916606851092495

      即使图像旋转也不会对该比较产生太大影响。

      笔记 Hu-矩是对平移、旋转和缩放不变的七个矩。第七个是倾斜不变的。这些值可以使用cv.HuMoments()函数找到。

      彩蛋(彩蛋我会在后面进行更新)

      1. 检查 cv.pointPolygonTest() 的文档,您可以找到红色和蓝色的漂亮图像。它表示所有像素到其上白色曲线的距离。曲线内的所有像素都呈蓝色,具体取决于距离。同样,外部点是红色的。轮廓边缘用白色标记。所以问题很简单。编写代码来创建这样的距离表示。
      2. 使用 cv.matchShapes() 比较数字或字母的图像。 (这将是迈向 OCR 的简单一步)

网友评论

搜索
最新文章
热门文章
热门标签
 
 女人梦见猫攻击自己  带缘分的42种梦境梦见鱼  梦见头发剪短了