几何图形的绘制方法

  • 一、基本图形的绘制
    • 1. 矩形
    • 2. 圆形
    • 3. 直线
    • 4. 椭圆
  • 二、多边形绘制方法
    • 2.1 多边形边框
    • 2.2 多边形填充
    • 2.3 绘制多个多边形

  在正文开始之前,首先要知道屏幕中 (0, 0) 坐标点在左上角,最大坐标在右下角。

一、基本图形的绘制

1. 矩形

  OpenCV中绘制矩形的函数为 rectangle()

void rectangle(InputOutputArray img, Rect rec, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);
参数 作用
InputOutputArray img 要绘制的目标图像
Rect rec rect类对象
const Scalar& color 线条的颜色
int thickness = 1 正数表示线条宽度,-1表示填充矩形
int lineType = LINE_8 线条的类型
int shift = 0 坐标点的小数点位数

绘制矩形的示例程序如下:

void MyDemo::drawing_Demo(Mat& image) {//绘制矩形Rect rect;rect.x = 250;    //左上端点x坐标rect.y = 170; //左上端点x坐标rect.width = 100; //宽度rect.height = 100; //高度rectangle(image, rect, Scalar(0, 0, 255), 2, 8, 0);imshow("Drawing", image);
}

2. 圆形

  OpenCV中绘制圆形的函数为 rectangle()

void cv::circle (InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0);
参数 作用
InputOutputArray img 要绘制的目标图像
Point center 圆心坐标
int radius 圆的半径
const Scalar &color 圆的颜色
int thickness=1 正数表示线条宽度,-1表示填充圆
int lineType = LINE_8 线条的类型
int shift = 0 坐标点的小数点位数

绘制圆形的示例程序如下:

void MyDemo::drawing_Demo(Mat& image) {//绘制圆circle(image, Point(250, 170), 20, Scalar(255, 0, 0), -1, 8, 0);imshow("Drawing", image);
}

  

3. 直线

  OpenCV中绘制直线的函数为 rectangle()

void cv::line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0);
参数 作用
InputOutputArray img 要绘制的目标图像
Point pt1r 端点1的坐标
Point pt2 端点2的坐标
const Scalar &color 线条的颜色
int thickness=1 线条宽度
int lineType = LINE_8 线条的类型
int shift = 0 坐标点的小数点位数

绘制圆形的示例程序如下:

void MyDemo::drawing_Demo(Mat& image) {//绘制直线line(image, Point(250, 170), Point(350, 270), Scalar(0, 255, 0), 2, LINE_AA, 0);imshow("Drawing", image);
}

  

4. 椭圆

  OpenCV中绘制椭圆的函数为 ellipse()

void ellipse(Mat&img, const RotatedRect&box, const Scalar& color, int thickness=1, int lineType=8);
参数 作用
Mat&img 要绘制的目标图像
const RotatedRect&box 椭圆类
const Scalar &color 椭圆的颜色
int thickness=1 正数表示线条宽度,-1表示填充圆
int lineType = LINE_8 线条的类型

其中椭圆类RotatedRect的属性如下(示例):

RotatedRect rrt; //创建对象
rrt.center = Point(100, 200);  //椭圆中心点
rrt.size = Size(100, 200);     //椭圆大小(横轴,纵轴长度)
rrt.angle = 0;     //旋转角度

绘制圆形的示例程序如下:

void MyDemo::drawing_Demo(Mat& image) {//绘制椭圆RotatedRect rrt;rrt.center = Point(100, 200);rrt.size = Size(100, 200);rrt.angle = 0;ellipse(image, rrt, Scalar(0, 255, 255), 1, 8);imshow("Drawing", image);
}

  

二、多边形绘制方法

  多边形绘制的本质是定义一个由多个点组成的点集,以此连接点集中的各个点,从而形成多边形。

2.1 多边形边框

  绘制多边形的边框使用到的函数是 ploylines()

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 坐标点的小数点位数

示例程序:绘制五边形

void MyDemo::polyDrawing_Demo() {//创建画布Mat bg = Mat::zeros(Size(512, 512), CV_8UC3);//创建五个点,作为多边形五个顶点Point p1(100, 100);Point p2(350, 100);Point p3(450, 300);Point p4(250, 450);Point p5(80, 200);//将五个点依次添加到点集中std::vector<Point> pts;pts.push_back(p1);pts.push_back(p2);pts.push_back(p3);pts.push_back(p4);pts.push_back(p5);//绘制多边形边框polylines(bg, pts, true, Scalar(0, 255, 255), 3, LINE_AA, 0);imshow("Poly Drawing!", bg);
}

其中 pts.push_back 用于将点加入到点集数组中,用于不知道点集数量的情况。本程序已知共五个点,因此也可以使用如下的代码创建点集:

    std::vector<Point> pts(5);pts[0] = p1;pts[1] = p2;pts[2] = p3;pts[3] = p4;pts[4] = p5;

2.2 多边形填充

  绘制填充的多边形使用到的函数是 fillPoly()

void cv::fillPoly(InputOutputArray   img,InputArrayOfArrays  pts,const Scalar & color,int        lineType = LINE_8,int      shift = 0
)
参数 作用
img 要绘制的目标图像
pts 提前构造的点集
color 多边形边框的颜色
lineType 线条的类型
shift 坐标点的小数点位数

示例程序:绘制填充的五边形

void MyDemo::polyDrawing_Demo() {//创建画布Mat bg = Mat::zeros(Size(512, 512), CV_8UC3);//创建五个点,作为多边形五个顶点Point p1(100, 100);Point p2(350, 100);Point p3(450, 300);Point p4(250, 450);Point p5(80, 200);//将五个点依次添加到点集中std::vector<Point> pts;pts.push_back(p1);pts.push_back(p2);pts.push_back(p3);pts.push_back(p4);pts.push_back(p5);//绘制封闭的五边形fillPoly(bg, pts, Scalar(255, 255, 0), 8, 0);imshow("Poly Drawing!", bg);
}

2.3 绘制多个多边形

  绘制多个多边形使用到的函数是 drawContours()

void drawContours(InputOutputArray   image,InputArrayOfArrays    contours,int    contourIdx,const Scalar& color,int  thickness=1,int    lineType=8,InputArray  hierarchy=noArray(),int        maxLevel=INT_MAX,Point         offset=Point() )
参数 作用
img 要绘制的目标图像
contours 输入的轮廓组,每一组轮廓由点vector构成
contourIdx 画第几个轮廓,如果该参数为负值,则画全部轮廓
color 线条的颜色
thickness 线条宽度,负值或CV_FILLED表示填充轮廓内部
lineType 线条的类型

示例程序:绘制一个五边形

void MyDemo::polyDrawing_Demo() {//创建画布Mat bg = Mat::zeros(Size(512, 512), CV_8UC3);//创建五个点,作为多边形五个顶点Point p1(100, 100);Point p2(350, 100);Point p3(450, 300);Point p4(250, 450);Point p5(80, 200);//将五个点依次添加到点集中std::vector<Point> pts;pts.push_back(p1);pts.push_back(p2);pts.push_back(p3);pts.push_back(p4);pts.push_back(p5);//添加点集到contours//(相当于contours是点集的集合)std::vector<std::vector<Point>> contours;contours.push_back(pts);//绘制多边形drawContours(bg, contours, -1, Scalar(255, 0, 255), -1);imshow("Poly Drawing!", bg);
}

【学习OpenCV4】几何图形的绘制方法相关推荐

  1. 【学习OpenCV4】OpenCV绘制标记/线/矩形/文字/圆等

    本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...

  2. plantuml 方法图_UML与软件建模:第四次作业(学习PlantUML活动图绘制方法)

    @startuml |Swimlane1| start :foo1; |#AntiqueWhite|Swimlane2| :foo2; :foo3; |Swimlane1| :foo4; |Swiml ...

  3. 学习业务流程图绘制方法(上)

    前言 本文会包含几块内容: 1. 什么是流程图?流程图和其他图表(如线框图,概念图,架构图,用例图)有什么不同? 2. 为什么需要流程图? 3. 流程图的分类? 4. 如何绘制流程图? 5. 流程图绘 ...

  4. GUI编程基础学习(四)——常见几何图形的绘制

    绘制直线 在Java中可以使用以下方法绘画一条直线 drawLine(int x1,int y1,int x2,int y2); 其中参数(x1,y1)是直线的起点,(x2,y2)是直线的终点 绘制矩 ...

  5. opengl 多边形线框_opengl基础学习专题 (三) 多边形绘制的几种样式

    题外话 聪明人之所以不会成功,是由于他们缺乏坚韧的毅力. --艾萨克·牛顿(1643年1月4日-1727年3月31日)英国 也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向 ...

  6. 【学习OpenCV4】键盘鼠标操作总结

    本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...

  7. 强化学习(四) - 蒙特卡洛方法(Monte Carlo Methods)及实例

    强化学习(四) - 蒙特卡洛方法(Monte Carlo Methods)及实例 4. 蒙特卡洛方法 4.1 蒙特卡洛预测 例4.1:Blackjack(21点) 4.2 动作价值的蒙特卡洛估计 4. ...

  8. python绘制横向堆积柱状图_Python 堆叠柱状图绘制方法

    本文介绍了Python 堆叠柱状图绘制方法,分享给大家,具体如下: '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  9. Canvas学习:封装Canvas绘制基本图形API

    Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习 从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方法, ...

最新文章

  1. Linux内核分析--内核中的数据结构双向链表续【转】
  2. TreeView查获节点并选中节点
  3. x9此计算机上没有hasp_为什么我在别人电脑上好装mastercam9,在自己电脑装不成功,它没有出现什么HASP驱动安装的提示,为什么...
  4. Oracle run leve,UNIX自动启动oracle
  5. C#LeetCode刷题之#448-找到所有数组中消失的数字(Find All Numbers Disappeared in an Array)
  6. java连接池域名切换_java - 使用JDBC的连接池选项:DBCP与C3P0
  7. docker部署mysql项目_Docker部署项目步骤
  8. 从零开始山寨Caffe·叁:全局线程管理器
  9. 拓端tecdat|R语言非参数模型厘定保险费率:局部回归、广义相加模型GAM、样条回归
  10. 不愧是阿里P8!黑马程序员java培训学费
  11. 如何计算离职率(2)?
  12. 一加nfc门禁卡录入_一加7t怎么开启NFC 模拟门禁卡方法介绍
  13. Application启动流程
  14. 【基础逻辑】对位乘法与升多项式子项根号——柯西不等式
  15. 21-7-09 主要元素
  16. 问题记录:Ubuntu中source运行.sh shell脚本报错:command not found 未找到命令
  17. 用EFS加密文件的方法
  18. Ti 官方文档阅读笔记
  19. [Demo]提取个人博客园闪存+评论
  20. L0范式、L1范式、L2范式解释通俗版

热门文章

  1. 莫比乌斯反演(bzoj 2301: [HAOI2011]Problem b)
  2. 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。
  3. 贺利坚老师汇编课程53笔记:寄存器冲突问题解决方案定义子程序标准框架
  4. 有关8086必须记住的几个数(持续更新)
  5. Python Linked List
  6. 购物车项目 复杂版本.待简化
  7. springcloud(八):配置中心服务化和高可用
  8. .Net Core中使用ref和SpanT提高程序性能
  9. IOS创建静态库Cocoa Touch Static Library
  10. Memcached在大型网站中应用[php 转载]