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

【youcans 的 OpenCV 例程300篇】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

参数说明:

  • 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]])
    

    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)*224img1 = 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()

【本节完】

版权声明:
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. 绘制多段线和多边形

【OpenCV 例程300篇】216. 绘制多段线和多边形相关推荐

  1. 【youcans的OpenCV例程300篇】总目录

    版权声明: 转载本系列作品时必须标注以下版权内容: [youcans@qq.com, youcans的OpenCV 例程300篇, https://blog.csdn.net/youcans/cate ...

  2. 【OpenCV 例程300篇】214. 绘制椭圆的参数详解

    OpenCV 例程200篇 总目录 [youcans 的 OpenCV 例程300篇]214. 绘制椭圆的参数详解 OpenCV提供了绘图功能,可以在图像上绘制直线.矩形.圆.椭圆等各种几何图形. 7 ...

  3. 【OpenCV 例程 300篇】222. 特征提取之弗里曼链码(Freeman chain code)

    OpenCV 例程200篇 总目录 [youcans 的 OpenCV 例程 300篇]222. 特征提取之弗里曼链码(Freeman chain code) 目标特征的基本概念 通过图像分割获得多个 ...

  4. 【OpenCV 例程 300 篇】112. 滤波反投影重建图像

    专栏地址:『youcans 的 OpenCV 例程 300篇 - 总目录』 [第 7 章:图像复原与重建] 110. 投影和雷登变换 111. 雷登变换反投影重建图像 112. 滤波反投影重建图像 [ ...

  5. 【OpenCV 例程 300篇】241. 尺度不变特征变换(SIFT)

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]241. 尺度不变特征变换(SIFT) 6.4.1 简介 尺度不变特征转换算法(Sc ...

  6. 【OpenCV 例程 300篇】235. 特征提取之主成分分析(sklearn)

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]235. 特征提取之主成分分析(sklearn) 特征提取是指从原始特征中通过数学变 ...

  7. 【OpenCV 例程 300篇】256. 特征检测之 CenSurE(StarDetector)算法

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]256. 特征检测之 CenSurE(StarDetector)算法 6.9.1 算 ...

  8. 【OpenCV 例程 300篇】244. 特征检测之 BRIEF 特征描述

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]244. 特征检测之 BRIEF 特征描述 6.7.1 算法简介 二进制鲁棒独立的特 ...

  9. 【OpenCV 例程300篇】200.轮廓的基本属性

    OpenCV 例程200篇 总目录-202206更新 文章目录 [youcans 的 OpenCV 例程300篇]200.轮廓的基本属性 2.4 轮廓的基本属性 2.4.1 轮廓的宽高比(Aspect ...

最新文章

  1. 【java开发系列】—— struts2简单入门示例
  2. 在VMware Workstation中安装Ubuntu设置网络连接
  3. asp.net webform html,ASP.NET WebForm页面内容输出方式
  4. php elasticsearch ik,elasticsearch和analysis-ik的安装使用
  5. ffmpeg拿AVPacket做缓冲队列时注意
  6. Hadoop最常用的工具(SQL on Hadoop):Hive
  7. Django中间件2
  8. ib课程计算机科学内容,新的IB计算机课程主要学习什么内容?有什么新的特点呢?...
  9. 【课程】MIT最新深度学习课程集
  10. 三、Dart Hello World
  11. String对象不可改变的特性
  12. 计算机模拟求解流体力学方程,计算流体力学模拟(CFD模拟)FLUENT中的湍流模型(一)...
  13. 使用Photoshop分解gif
  14. win10文件夹加密_Win10系统加密文件夹
  15. 图片太大如何压缩?学会这个方法轻松压缩
  16. kubernetes完整学习笔记
  17. java jfreechart 柱状图,JFreeChart -- 柱状图
  18. python在遥感中的应用_Python在遥感中的应用——导言
  19. 微信小程序接入阿里云直播
  20. 除湿性能测试软件,性能测试 除湿效率

热门文章

  1. 图像检索评价指标:mAP@k、mAP的计算
  2. 2019 AI算法岗求职攻略
  3. 导图解书-羁绊(01)《销讲成交策略》
  4. 管理类联考•逻辑——解题技巧汇总
  5. Bluetooth 8852B测试仪笔记整理
  6. Michael I. Jordan联合UC伯克利13位重量级学者:下一代人工智能系统的4大趋势和9大研究课题
  7. 雷达系列论文翻译(十):Scan registration using segmented region growing NDT
  8. AnyView网络警V4破解版(26用户正式版)
  9. C/C++开发资源及下载汇总
  10. [Android下载]北京新版小学英语三年级上册点读手机软件