• 【OpenCV 例程200篇】216. 绘制多段线和多边形


    专栏地址:『youcans 的 OpenCV 例程200篇』
    文章目录:『youcans 的 OpenCV 例程200篇-总目录』


    【youcans 的 OpenCV 例程200篇】216. 绘制多段线和多边形


    函数 cv.polylines() 用来绘制多边形曲线或多段线。
    函数 cv.fillPoly() 用来绘制一个或多个填充的多边形区域。
    函数 cv.fillConvexPoly() 用来绘制一个填充的凸多边形。

    函数原型:

    cv.polylines(img, pts, isClosed, color[, thickness=1, lineType=LINE_8, shift=0]) → img
    cv.fillPoly(img, pts, color[, lineType=LINE_8, shift=0, offset=Point()]) → img
    cv.fillConvexPoly(img, points, color[, lineType=LINE_8, shift=0]) → img
    
    • 1
    • 2
    • 3

    参数说明:

    • img:输入输出图像,允许单通道灰度图像或多通道彩色图像
    • pts:多边形顶点坐标, 二维 Numpy 数组的列表
    • points:多边形顶点坐标,二维 Numpy 数组
    • isClosed: 闭合标志,True 表示闭合多边形,False 表示多边形不闭合

    注意事项:

    1. 特别注意多边形顶点坐标 pts 的格式:
      pts 是一个列表,列表中的元素是二维 Numpy 数组,每个元素表示一组顶点坐标。
      二维 Numpy 数组的形状为 (m,2),每行表示多边形的一个顶点的坐标 (xi,yi),数据格式应为整型。

      例如:

      points1 = np.array([[200,100], [295,169], [259,281], [141,281], [105,169]], np.int)
      points2 = np.array([[200,400], [259,581], [105,469], [295,469], [141,581]])
      
      • 1
      • 2

      points1、points2 是形状为 (m,2) 的二维 Numpy 数组。
      对于函数 cv.fillConvexPoly,使用二维 Numpy 数组 points1 或 points2 作为参数。
      对于函数 cv.polylines 与 cv.fillPoly,不能直接把二维 Numpy 数组 points1 或 points2作为函数参数,而要将其作为列表的元素,如: [points1]、[points2] 或 [points1, points2]。

    2. 函数 cv.polylines 与 cv.fillPoly 可以绘制或填充一个或多个多边形。
      当列表 pts 中只有一个元素,即一个二维 Numpy 数组时,绘制一个多边形;
      当列表 pts 中有多个元素,即多个二维 Numpy 数组时,绘制多个多边形,每个二维 Numpy 数组中的顶点坐标被作为一个多边形处理。

    3. 闭合标志为 True 时绘制闭合多边形,将绘制从最后一个顶点到第一个顶点之间的线段;闭合标志为 False 时绘制非闭合的多段线,最后一个顶点与第一个顶点之间不连接。

    4. 函数 cv.fillPoly 与 cv.fillConvexPoly 都可以绘制填充多边形。
      cv.fillConvexPoly 的运行速度比 cv.fillPoly 快得多,特别适合填充凸多边形,经常用于轮廓处理。

    5. 函数 cv.fillConvexPoly 不仅可以填充凸多边形,还可以填充任何没有自相交的单调多边形,即轮廓最多与每条水平线相交两次的多边形(尽管其最顶部和/或底部边缘可能是水平的)。
      这句话来自官方文档,括号中内容“最顶部和/或底部边缘可能是水平的”不容易理解,可以结合例程 4.7 右下图理解。作者建议除轮廓处理外,尽量不要用 cv.fillConvexPoly 来填充非凸的多边形。


    例程 A4.7:绘制多段线和多边形

       # A4.7 绘制多段线和多边形
        img = np.ones((980, 400, 3), np.uint8)*224
        img1 = img.copy()
        img2 = img.copy()
        img3 = img.copy()
        img4 = img.copy()
    
        # 多边形顶点
        points1 = np.array([[200,100], [295,169], [259,281], [141,281], [105,169]], np.int)
        points2 = np.array([[200,400], [259,581], [105,469], [295,469], [141,581]])  # (5,2)
        points3 = np.array([[200,700], [222,769], [295,769], [236,812], [259,881],
                         [200,838], [141,881], [164,812], [105,769], [178,769]])
        print(points1.shape, points2.shape, points3.shape)  # (5, 2) (5, 2) (10, 2)
    
        # 绘制多边形,闭合曲线
        pts1 = [points1]  # pts1 是列表,列表元素是形状为 (m,2) 的 numpy 二维数组
        cv.polylines(img1, pts1, True, (0,0,255))  # pts1  是列表
        cv.polylines(img1, [points2, points3], 1, 255, 2)  # 可以绘制多个多边形
    
        # 绘制多段线,曲线不闭合
        cv.polylines(img2, [points1], False, (0,0,255))
        cv.polylines(img2, [points2, points3], 0, 255, 2)  # 可以绘制多个多段线
    
        # 绘制填充多边形,注意交叉重叠部分处理
        cv.fillPoly(img3, [points1], (0,0,255))
        cv.fillPoly(img3, [points2, points3], 255)  # 可以绘制多个填充多边形
    
        # 绘制一个填充多边形,注意交叉重叠部分
        cv.fillConvexPoly(img4, points1, (0,0,255))
        cv.fillConvexPoly(img4, points2, 255)  # 不能绘制存在自相交的多边形
        cv.fillConvexPoly(img4, points3, 255)  # 可以绘制凹多边形,但要慎用
    
        plt.figure(figsize=(9, 6))
        plt.subplot(141), plt.title("closed polygon"), plt.axis('off')
        plt.imshow(cv.cvtColor(img1, cv.COLOR_BGR2RGB))
        plt.subplot(142), plt.title("unclosed polygo"), plt.axis('off')
        plt.imshow(cv.cvtColor(img2, cv.COLOR_BGR2RGB))
        plt.subplot(143), plt.title("fillPoly"), plt.axis('off')
        plt.imshow(cv.cvtColor(img3, cv.COLOR_BGR2RGB))
        plt.subplot(144), plt.title("fillConvexPoly"), plt.axis('off')
        plt.imshow(cv.cvtColor(img4, cv.COLOR_BGR2RGB))
        plt.tight_layout()
        plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    在这里插入图片描述


    【本节完】

    版权声明:
    youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125468148)
    Copyright 2022 youcans, XUPT
    Crated:2022-6-26
    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
    欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

    210. 绘制直线也会有这么多坑?
    211. 绘制垂直矩形
    212. 绘制倾斜的矩形
    213. 绘制圆形
    214. 绘制椭圆的参数详解
    215. 基于多段线绘制近似椭圆
    216. 绘制多段线和多边形

  • 相关阅读:
    Linux系统后门监测工具chkrootkit安装与使用
    白嫖游戏指南,Epic喜加二:《INDUSTRIA》《LISA: Definitive Edition》
    Openlayers 快速上手教程
    2.Android应用资源
    项目管理工具dhtmlxGantt入门教程(一):如何安装dhtmlxGantt
    9月最新外贸进出口数据出来了,外贸整体向好
    电脑监控系统,实现可视化管理!
    毅速科普课堂丨3D打印随形水路模具制造的一般流程
    c语言常见函数<sting.h>字符串处理函数
    电脑重装系统苹果电脑开不了机的原因分析
  • 原文地址:https://blog.csdn.net/youcans/article/details/125468148