【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

参数说明:

  • 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. 绘制多段线和多边形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OpenCV 例程200篇】217. 鼠标交互获取多边形区域(ROI)

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】217. 鼠标交互获取多边形区域 函数 cv.selectROI 可以通过鼠标在图像上选择感兴趣的矩形区域(ROI,region of interest)。 如果要通过鼠标在图像上选择感兴趣的多边形区域&#xff0c…

【OpenCV 例程200篇】218. 多行倾斜文字水印

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】218. 多行倾斜文字水印 8.1 添加多行倾斜文字水印 水印是叠加在图像上的标志、签名、文本或图案,用于保护图像的版权。 先在黑色背景上添加图像或文字制作水印,再使用 cv.addWeight 函数&…

【OpenCV 例程200篇】219. 添加数字水印(盲水印)

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】219. 添加数字水印(盲水印) 8.2 添加数字盲水印 数字水印,是指将特征信息嵌入音频、图像或是视频等数字信号中。 数字水印分为明水印和盲水印(blind watermark&#x…

搜索栏联想词提示

在我们需要游览一些网站的时候,我们经常需要使用搜索引擎来进行搜索,无论是百度谷歌还是搜狐等,我们都需要在搜索栏中输入相关的搜索词,当我们点击进行输入的时候,下面会给出许许多多的提示词,程序自动联想…

【OpenCV 例程200篇】220.对图像进行马赛克处理

文章目录:『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】220.对图像进行马赛克处理 9. 图像的马赛克处理 马赛克效果是广泛使用的图像和视频处理方法。将图像中指定区域的色阶细节劣化,造成色块模糊的效果,看上…

【OpenCV 例程200篇】223. 特征提取之多边形拟合(cv.approxPolyDP)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】223. 特征提取之多边形拟合 目标特征的基本概念 通过图像分割获得多个区域,得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标,目标所处的区域就是目标…

Eclipse快捷键生成语句

当我们使用Eclipse进行项目的开发的时候,有的时候我们需要重复输入main方法和输出语句等,下面就教给大家如何在Eclipse开发中使用快捷键生长main方法和输出语句。 快捷键生成语句 生成main方法:输入"main" ,按ALT/&…

【OpenCV 例程200篇】221.加密马赛克图像处理与解密复原

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】221.加密马赛克图像处理与解密复原 9. 图像的马赛克处理 马赛克效果是广泛使用的图像和视频处理方法。将图像中指定区域的色阶细节劣化,造成色块模糊的效果,看上去像是一个个…

小网站asp好还是php好,网站程序是asp好还是php好,哪个更利于优化?

网站程序是asp好还是php好呢?如果我们要做seo优化,哪一个又更利于优化呢?毕竟,现在在网上所看到的程序,是比较多的,选择一个好的网站程序,可以少走很多弯路。如果,大家建一个网站是为…

Java IO深入

IO体系 Java IO 体系种类繁多,感觉很复杂,但其实是 IO 涉及的因素太多了。在进行介绍的时候添加了设计模式等的使用,会让你感觉更加难以理解难以使用这些IO类,在此对java的IO做了一个详细的总结。 IO 类设计出来,肯定…

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

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】222. 特征提取之弗里曼链码(Freeman chain code) 目标特征的基本概念 通过图像分割获得多个区域,得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff…

【OpenCV 例程200篇】224. 特征提取之提取骨架

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】224. 特征提取之提取骨架 目标特征的基本概念 通过图像分割获得多个区域,得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标,目标所处的区域就是目标区域。 特征通常是针…

inuri .php id=,php常用函数(遇见就补充)

preg_match()preg_match(string pattern, string subject [, array matches [, int flags]])在subject字符串中搜索与 pattern给出的正则表达式相匹配的内容。如果提供了 matches,则会被搜索的结果所填充。$matches[0]将包含于整个模式匹配的文本,$match…

【OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率 特征通常是针对于图像中的某个目标而言的。 我们把感兴趣的人或物称为目标,目标所处的区域就是目标区域。图像分割之后,还要对目标区域进…

Java常见的几种设计模式

单例模式 指一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。 getInstance()的返回值是一个对象的引用,并不是一个新的实例&a…

【OpenCV 例程200篇】227. 特征描述之 LBP 纹理特征算子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】227. 特征描述之 LBP 纹理特征算子 特征通常是针对于图像中的某个目标而言的。 针对目标所在区域的特征描述符(Region descriptors),称为区域特征描述子。 4.2 纹…

【OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子 特征通常是针对于图像中的某个目标而言的。针对目标所在区域的特征描述符(Region descriptors),称为区域特征描述子。 局部…

【OpenCV 例程200篇】229. 特征描述之 LBP 算子比较(skimage)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】229. 特征描述之 LBP 算子比较(skimage) 局部二值模式(LBP,Local binary patterns)是一种用来描述图像局部纹理特征的算子,它具…

Java多线程的使用

无论在我们的工作中还是在我们的生活中,我们都会用到多线程的知识,今天就给大家讲一下如何使用多线程。 序幕 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 我们首先要知道进程和线程分别是什么? 进程 - 进…

oracle 存储过程 db,oracle数据库的存储过程是什么?

oracle数据库的存储过程:一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。存储过程(Stored Procedur…