作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

函数原型

void fillConvexPoly(InputOutputArray img, InputArray points,const Scalar& color, int lineType = LINE_8,int shift = 0);
void fillPoly(InputOutputArray img, InputArrayOfArrays pts,const Scalar& color, int lineType = LINE_8, int shift = 0,Point offset = Point() );

参数说明

  1. InputOutputArray类型的img,输入图像也是输出图像,如Mat类型。
  2. InputArrayOfArrays类型的pts,存放多个多边形的顶点集合;InputArray类型的points,存放单个凸多边形的顶点集合。
  3. Scalar类型的color,文字颜色。
  4. int类型的line_type,绘制线的类型,-1就是FILLED(填满),4是LINE_4(4连通域),8是LINE_8(8连通域),LINE_AA(抗锯齿线)。
  5. int类型的shift,顶点坐标中的小数位数。
  6. Point类型的offset,轮廓的所有点的可选偏移量。

测试代码

#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{cv::Mat src = imread("test.jpg");cv::Mat result = src.clone();cv::Mat result2 = src.clone();// 多边形顶点坐标vector<Point> points1,points2;points1.push_back(Point(src.cols / 4, src.rows / 4));points1.push_back(Point(src.cols / 4, src.rows / 8));points1.push_back(Point(src.cols / 2, src.rows / 6));points1.push_back(Point(src.cols / 3, src.rows / 2));points1.push_back(Point(src.cols / 2, src.rows / 8));points2.push_back(Point(src.cols / 3, src.rows / 3));points2.push_back(Point(src.cols / 2, src.rows / 2));points2.push_back(Point(3 * src.cols / 4, src.rows / 2));points2.push_back(Point(5 * src.cols / 8, 3 * src.rows / 4));points2.push_back(Point(src.cols / 2, src.rows / 3));// 每个vector<Point>就是一个多边形vector<vector<Point>> pic;pic.push_back(points1);pic.push_back(points2);// 绘制多边形集合fillPoly(result, pic, Scalar(0, 0, 255), 16, 0);// 绘制单个凸多边形fillConvexPoly(result2, points2, Scalar(0, 0, 255), 16, 0);imshow("original", src);imshow("result", result);imshow("result2", result2);waitKey(0);system("pause");return 0;
}

测试效果

图1 原图

图2 fillPoly效果图

图3 fillConvexPoly效果图

注意fillPoly在绘制多个多边形时,如果某两个多边形有交叉,则该交叉区域便取消填充,并保持原样,可以想象成将一个flag从false设为true,又设为false。

除此之外,两个多边形绘制函数的原理有所差异。区别除了一个是绘制单个多边形,另一个可以绘制多个多边形;还有个更关键的差异,fillConvexPoly绘制的是凸多边形,而fillPoly可以绘制任意多边形,我将点集换成如下:

points2.push_back(Point(src.cols / 3, 7*src.rows / 8));
points2.push_back(Point(src.cols / 2, src.rows / 2));
points2.push_back(Point(3 * src.cols / 4, src.rows / 2));
points2.push_back(Point(5 * src.cols / 8, 3 * src.rows / 4));
points2.push_back(Point(src.cols / 2, 2*src.rows / 3));

正常得到的图形应该是如fillPoly显示的这样,如图4。

图4 fillPoly绘制任意形状的多边形

而fillConvexPoly的绘制效果,如图5所示。

图5 fillConvexPoly绘制凸多边形

不难看出,fillConvexPoly把最后连接处的那个缺口给补了起来,所以在使用这两个函数时注意自身需求,再判断使用哪一个函数。

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

OpenCV-绘制多边形(fillConvexPoly和fillPoly的区别)相关推荐

  1. OpenCV 填充多边形 fillConvexPoly 和 fillPoly

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

  2. opencv 绘制轮廓边框 多边形 圆形 矩形

    如何使用opencv 绘制轮廓边框最小包裹 多边形 圆形 矩形? 函数说明: Rect boundingRect(InputArray points) points:输入信息,可以为包含点的容器(ve ...

  3. OpenCv绘制简单的几何图形

    opencv常用绘制方法 前言 1.直线line line的函数原型如下 使用方法 2.箭头arrowedLine arrowedLine的函数原型如下 使用方法 3.矩形rectangle. rec ...

  4. 10、OpenCV绘制几何图形

    OpenCV绘制几何图形 一.学习目标 二.OpenCV中点和颜色标量的表示 三.绘制不同的几何形状 四.完整代码示例 一.学习目标 了解点和颜色标量的数据结构对象 学会使用OpenCV画直线段 学会 ...

  5. [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  6. 详解用OpenCV绘制各类几何图形

    本文分享自华为云社区<[Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形>,作者:eastmount. 一.绘制直线 在OpenCV中,绘制直线需要获取直线的起 ...

  7. OpenCV 绘制正多边形

    OpenCV 绘制正多边形 #include <iostream> #include <opencv2\core\core.hpp> #include <opencv2\ ...

  8. 在Unity中实现,使用笔刷绘制多边形

    在Unity中实现,使用笔刷绘制多边形 1. 啰嗦前言 2. 实现 1. 啰嗦前言 做毕设其中需要一个功能就是使用笔刷在地图刷绘制出河流之类的东西.如果只是绘制贴图或者顶点颜色,得到一张图片还是不难实 ...

  9. 使用Python,Opencv绘制调色板及圆形来模拟霓虹的渐变效果

    使用Python,Opencv绘制调色板及圆形来模拟霓虹的渐变效果 1. 效果图 2. 源码 参考 这篇博客将使用python,opencv绘制调色板及圆形来模拟霓虹的渐变效果. 1. 效果图 可以构 ...

最新文章

  1. 集成的分层强化学习,让人工智能在解决智能问题时表现得更聪明
  2. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...
  3. Log4j输出格式控制
  4. Spring - @ControllerAdvice + @ExceptionHandler全局处理Controller层异常(转)
  5. Eclipse中SVN的安装步骤(两种)和用法
  6. BZOJ 3745: [Coci2015]Norma(分治)
  7. android 7 蓝牙版本,[Android]Android什么版本开始支持蓝牙4.2?答案:Android 7.0
  8. java biginteger使用_在Java中使用BigInteger值
  9. 上班第一天,Myeclipse 2014上SVN部署以及maven 配置
  10. 笨办法学 Python · 续 练习 52:`moreweb`
  11. 安装eclipse及android,Eclipse Android 安装
  12. java闭包lambda,(lambda)函数闭包捕获了什么?
  13. 谈天津地铁之为民服务
  14. 《计算机操作系统(慕课版)》(汤小丹著)课后习题答案
  15. 2022年iOS面试题简答题
  16. 基于氚云平台的应用开发学习(三)
  17. 数据分析(Python)贡献度分析——帕累托法则
  18. T1 mapping的用途
  19. 趣聊51之串口通信(实现篇)
  20. SQL Server应用开发概述

热门文章

  1. 这个沙盒游戏建立在数字时代,你能通关吗?
  2. C#学习常用类(1003)---Timer类(System.Timers.Timer)
  3. ASP 中调用函数关于Call使用注意的问题
  4. 企业的创新和创新的双面性
  5. 1128. 等价多米诺骨牌对的数量
  6. python做oa系统_浅谈python进行webapp,oa系统开发 (更新中) | 学步园
  7. linux yum安装python3_linux下yum安装python3
  8. 在计算机中添加用户名和密码是多少,在win7系统中添加网络打印机提示输入用户名和密码的解决方案...
  9. arm 升腾310_简单说说华为海思的芯片产品线
  10. linux内核定时器 代码,Linux内核计时器