点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:opencv学堂

很多人都问过我这个问题,OpenCV中是怎么绘制与填充多边形的,特别是填充多边形的。因为根据OpenCV中的多边形绘制函数,他们发现这是一个无解的问题。其实我在2017底做一个项目的时候当时会对得到的一个多边形边缘轮廓进行填充,我就发现OpenCV中的多边形绘制函数无法填充,但是其实换个函数就会顺利搞定,只是大家被OpenCV官方的教程误导思维定势,没有想到而已。下面我们就来详细说一下,OpenCV中的多边形绘制与填充问题。

多边形绘制

OpenCV中支持常见的点、线、圆、椭圆与矩形的绘制与填充都是通过设置thickness这个参数来实现绘制与填充,当thickness是正数的时就会绘制;当thickness为非正数时就会填充。但是对多边形来说,polylines函数把thickness设置为非正数就会直接报错,无法通过修改thickness完成填充,该函数只能实现绘制。

void cv::polylines(InputOutputArray  img,InputArrayOfArrays       pts,bool        isClosed,const Scalar &        color,int   thickness = 1,int   lineType = LINE_8,int   shift = 0
)

参数解释

  • img表示绘制画布,图像

  • pts表示多边形的点

  • isClosed表示是否闭合,默认闭合

  • color表示颜色

  • thickness表示线宽,必须是正数

  • lineType表示线渲染类型

  • shift表示相对位移

绘制一个多边形的代码演示如下:

 1Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);2int w = canvas.cols;3int h = canvas.rows;4Point p1(100, 100);5Point p2(300, 150);6Point p3(300, 350);7Point p4(250, 450);8Point p5(50, 450);9std::vector<Point> pts;
10pts.push_back(p1);
11pts.push_back(p2);
12pts.push_back(p3);
13pts.push_back(p3);
14pts.push_back(p4);
15pts.push_back(p5);
16polylines(canvas, pts, true, Scalar(0, 255, 0), 1, 8, 0);

随机拾取5个点的坐标,然后完成绘制运行结果如下:

填充多边形

OpenCV中可以完成多边形填充的函数有两个,第一个填充多边形的函数为:

1void cv::fillPoly(
2         InputOutputArray  img,
3         InputArrayOfArrays       pts,
4         const Scalar &        color,
5         int   lineType = LINE_8,
6         int   shift = 0,
7         Point       offset = Point()
8)

该函数参数跟polylines很相似,唯一没有的就是thickness跟isClose参数,该函数会完成一个多边形的填充操作。代码演示如下:

 1Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);2int w = canvas.cols;3int h = canvas.rows;4Point p1(100, 100);5Point p2(300, 150);6Point p3(300, 350);7Point p4(250, 450);8Point p5(50, 450);9std::vector<Point> pts;
10pts.push_back(p1);
11pts.push_back(p2);
12pts.push_back(p3);
13pts.push_back(p3);
14pts.push_back(p4);
15pts.push_back(p5);
16fillPoly(canvas, pts, Scalar(255, 0, 255), 8, 0);
17polylines(canvas, pts, true, Scalar(0, 255, 255), 2, 8, 0);

第二个一次可以填充/绘制任意数目的多边形函数,该函数来自轮廓分析的轮廓绘制,因此很多人不会注意到它其实是一个很强悍的多边形填充与绘制函数,函数说明如下:

 1void cv::drawContours (        2    InputOutputArray  image,3    InputArrayOfArrays  contours,4    int   contourIdx,5    const Scalar &        color,6    int   thickness = 1,7    int   lineType = LINE_8,8    InputArray      hierarchy = noArray(),9    int   maxLevel = INT_MAX,
10    Point       offset = Point()
11)

该函数功能比较强大,一次可以完成多个多边形的填充与绘制,它本质上把每个多边形的顶点集作为轮廓看待,可以很方便的完成轮廓的绘制与填充,跟点、线、圆、椭圆与矩形的绘制与填充一样,都是通过设置thickness这个参数来实现绘制与填充。只是在输入的时候需要适当改一下。参数controus表示的多个多边形点集合,contourIdx大于零表示绘制指定索引的轮廓,-1表示绘制全部,thickness正数表示绘制,非正数表示填充。就这样一个函数就可以轻松搞定多边形的填充与绘制。代码实现如下:

 1Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);2int w = canvas.cols;3int h = canvas.rows;4Point p1(100, 100);5Point p2(300, 150);6Point p3(300, 350);7Point p4(250, 450);8Point p5(50, 450);9std::vector<Point> pts;
10pts.push_back(p1);
11pts.push_back(p2);
12pts.push_back(p3);
13pts.push_back(p3);
14pts.push_back(p4);
15pts.push_back(p5);
16std::vector<std::vector<Point>> contours;
17contours.push_back(pts);
18drawContours(canvas, contours, 0, Scalar(0, 0, 255), -1, 8);
19drawContours(canvas, contours, 0, Scalar(255, 0, 255), 2, 8);

运行结果如下:

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

技巧 | OpenCV中如何绘制与填充多边形相关推荐

  1. OpenCV 中的绘制功能

    本文主要内容来自于 OpenCV-Python 教程 的 OpenCV 中的 GUI 功能 部分,这个部分的主要内容如下: 图像操作入门 学习加载一幅图像,显示它,并保存它 视频入门 学习播放视频,从 ...

  2. 番外3. Python OpenCV 中如何绘制各种图形?

    本系列专栏写作方式 本系列专栏写作将采用首创的问答式写作形式,快速让你学习到 OpenCV 的初级.中级.高级知识. 3. Python OpenCV 中如何绘制各种图形? 本篇博客主要分享一下在 P ...

  3. python多边形图案_如何用matplotlib中的自定义图案填充多边形?

    您可以子类matplotlib.hatch.Shapes,并根据在unit square[[-0.5,0.5]x[-0.5,0.5]]内绘制的任何引用路径定义自定义图案填充.在 暂定:import n ...

  4. OpenCV基本图形绘制之填充连接区域内部

    先上代码 #include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> ...

  5. 使用OpenCV进行多边形绘制和填充

    OpenCV中在图像上进行多边形绘制和填充的函数分别为polylines和fillPoly,在图像分割任务中午中,可用于将预测结果绘制到目标图像. 简单的实现: import cv2 import n ...

  6. OpenCV中的内存泄漏检测

    转自:http://chaishushan.blog.163.com/blog/static/130192897200911685559809/ 内存泄漏时程序开发中经常遇到的问题. 而且出现内存泄漏 ...

  7. python画椭圆-python opencv圆、椭圆与任意多边形的绘制实例详解

    圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...

  8. ae中心点重置工具_AE中图形绘制的6大技巧,简单易操作

    AE中的图形系统和文字系统很相似,都有自己相对独立的一套基础动画系统.当我们打开AE软件,面对空白的面板,如何通过一步步的操作填充画面,做出酷炫的效果,这其中图形占据很大的比重,更不用说流行的MG动画 ...

  9. OpenCV 填充多边形 fillConvexPoly 和 fillPoly

    填充多边形 1. fillConvexPoly 1.1 函数定义 1.2 代码示例 2. fillPoly 2.1 函数定义 2.2 代码示例 3. 官方文档给的实例 1. fillConvexPol ...

最新文章

  1. 介绍 Java 的内存泄漏
  2. Javascript 多线程编程​的前世今生
  3. mysql日期可以保存时区_数据库存储时间的时区问题
  4. nlp论文-《Neural Machine Translation by Jointly Learning to Align and Translate》-基于联合学习对齐和翻译的神经机器翻译(一)
  5. TCP拥塞控制和TCP流量控制
  6. [IE 技巧] 输入错误网址自动转到搜索引擎的功能选项
  7. 声明与所在行数不兼容_深度理解:Windows DLL 二进制兼容性探究
  8. Python_提取图片像素值
  9. 刷机-升级到3.80M33的方法
  10. x96max+ 电视盒子如何刷入EmuELEC游戏系统
  11. android 微博 登录,Android第三方登录之微博登录
  12. [散文]茶想(作者:王莹莹)
  13. 流?I/O操作?阻塞?epoll?
  14. studio 3t MongoDB for MAC 201903+Cracking
  15. 在 Mac OS系统下选择、安装、配置 win 10虚拟机
  16. ESP32-CAM高性价比温湿度监控系统配网与上网方案设计与实现
  17. Ubuntu 命令行连接wifi
  18. Spark 启动报错时报错 java.lang.NoSuchMethodError: scala.collection.immutable.HashSet$.empty()Lscala/collect
  19. 毕设-基于SpringBoot房屋租赁系统
  20. 计算机编程 英语词汇

热门文章

  1. 一个让Python代码运行更快的最佳方式!
  2. 争论不休的TF 2.0与PyTorch,到底现在战局如何了? | 技术头条
  3. 受用一生的高效PyCharm使用技巧
  4. 如何用最强模型BERT做NLP迁移学习?
  5. AI芯片的“战国时代”:计算力将会驶向何方?
  6. 美团是怎么玩儿AI的?今晚8点揭秘美团超大规模知识图谱--美团大脑
  7. 了解这些,你就可以在Spring启动时为所欲为了
  8. 没有这 29 款插件的 Chrome 是没有灵魂的!
  9. 学会 IDEA REST Client后,postman就可以丢掉了...
  10. 深度学习环境配置指南!(Windows、Mac、Ubuntu全讲解)