当前位置:网站首页>【OpenCV 例程200篇】216. 绘制多段线和多边形
【OpenCV 例程200篇】216. 绘制多段线和多边形
2022-07-01 15:34:00 【小白YouCans】
专栏地址:『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 表示多边形不闭合
注意事项:
特别注意多边形顶点坐标 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]。函数 cv.polylines 与 cv.fillPoly 可以绘制或填充一个或多个多边形。
当列表 pts 中只有一个元素,即一个二维 Numpy 数组时,绘制一个多边形;
当列表 pts 中有多个元素,即多个二维 Numpy 数组时,绘制多个多边形,每个二维 Numpy 数组中的顶点坐标被作为一个多边形处理。闭合标志为 True 时绘制闭合多边形,将绘制从最后一个顶点到第一个顶点之间的线段;闭合标志为 False 时绘制非闭合的多段线,最后一个顶点与第一个顶点之间不连接。
函数 cv.fillPoly 与 cv.fillConvexPoly 都可以绘制填充多边形。
cv.fillConvexPoly 的运行速度比 cv.fillPoly 快得多,特别适合填充凸多边形,经常用于轮廓处理。函数 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()
【本节完】
版权声明:
[email protected] 原创作品,转载必须标注原文链接:(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. 绘制多段线和多边形
边栏推荐
- How to realize clock signal frequency division?
- MySQL高级篇4
- 使用 csv 导入的方式在 SAP S/4HANA 里创建 employee 数据
- What are the test items of juicer ul982
- 榨汁机UL982测试项目有哪些
- Task.Run(), Task.Factory.StartNew() 和 New Task() 的行为不一致分析
- STM32F4-TFT-SPI时序逻辑分析仪调试记录
- Description | Huawei cloud store "commodity recommendation list"
- Photoshop插件-HDR(二)-脚本开发-PS插件
- 关于用 ABAP 代码手动触发 SAP CRM organization Model 自动决定的研究
猜你喜欢
Zhang Chi's class: several types and differences of Six Sigma data
STM32F4-TFT-SPI时序逻辑分析仪调试记录
The difference between arrow function and ordinary function in JS
【一天学awk】函数与自定义函数
Pnas: brain and behavior changes of social anxiety patients with empathic embarrassment
【STM32-USB-MSC问题求助】STM32F411CEU6 (WeAct)+w25q64+USB-MSC Flash用SPI2 读出容量只有520KB
《性能之巅第2版》阅读笔记(五)--file-system监测
Wechat official account subscription message Wx open subscribe implementation and pit closure guide
Returning to the top of the list, the ID is still weak
Raytheon technology rushes to the Beijing stock exchange and plans to raise 540million yuan
随机推荐
Summary of point cloud reconstruction methods I (pcl-cgal)
Rhcsa fourth day operation
Logical analysis of automatic decision of SAP CRM organization model
MySQL高级篇4
《QT+PCL第九章》点云重建系列2
如何实现时钟信号分频?
swiper 轮播图,最后一张图与第一张图无缝衔接
Opencv Learning Notes 6 -- image feature [harris+sift]+ feature matching
Implementation of deploying redis sentry in k8s
张驰咨询:家电企业用六西格玛项目减少客户非合理退货案例
Flink 系例 之 TableAPI & SQL 与 MYSQL 分组统计
The last picture is seamlessly connected with the first picture in the swiper rotation picture
Task.Run(), Task.Factory.StartNew() 和 New Task() 的行为不一致分析
k8s部署redis哨兵的实现
Wechat applet 01 bottom navigation bar settings
Tableapi & SQL and MySQL grouping statistics of Flink
Opencv Learning Notes 6 -- image mosaic
SAP S/4HANA: 一条代码线,许多种选择
选择在长城证券上炒股开户可以吗?安全吗?
Short Wei Lai grizzly, to "touch China" in the concept of stocks for a living?