【学习OpenCV4】几何图形的绘制方法
几何图形的绘制方法
- 一、基本图形的绘制
- 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】几何图形的绘制方法相关推荐
- 【学习OpenCV4】OpenCV绘制标记/线/矩形/文字/圆等
本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...
- plantuml 方法图_UML与软件建模:第四次作业(学习PlantUML活动图绘制方法)
@startuml |Swimlane1| start :foo1; |#AntiqueWhite|Swimlane2| :foo2; :foo3; |Swimlane1| :foo4; |Swiml ...
- 学习业务流程图绘制方法(上)
前言 本文会包含几块内容: 1. 什么是流程图?流程图和其他图表(如线框图,概念图,架构图,用例图)有什么不同? 2. 为什么需要流程图? 3. 流程图的分类? 4. 如何绘制流程图? 5. 流程图绘 ...
- GUI编程基础学习(四)——常见几何图形的绘制
绘制直线 在Java中可以使用以下方法绘画一条直线 drawLine(int x1,int y1,int x2,int y2); 其中参数(x1,y1)是直线的起点,(x2,y2)是直线的终点 绘制矩 ...
- opengl 多边形线框_opengl基础学习专题 (三) 多边形绘制的几种样式
题外话 聪明人之所以不会成功,是由于他们缺乏坚韧的毅力. --艾萨克·牛顿(1643年1月4日-1727年3月31日)英国 也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向 ...
- 【学习OpenCV4】键盘鼠标操作总结
本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...
- 强化学习(四) - 蒙特卡洛方法(Monte Carlo Methods)及实例
强化学习(四) - 蒙特卡洛方法(Monte Carlo Methods)及实例 4. 蒙特卡洛方法 4.1 蒙特卡洛预测 例4.1:Blackjack(21点) 4.2 动作价值的蒙特卡洛估计 4. ...
- python绘制横向堆积柱状图_Python 堆叠柱状图绘制方法
本文介绍了Python 堆叠柱状图绘制方法,分享给大家,具体如下: '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- Canvas学习:封装Canvas绘制基本图形API
Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习 从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方法, ...
最新文章
- Linux内核分析--内核中的数据结构双向链表续【转】
- TreeView查获节点并选中节点
- x9此计算机上没有hasp_为什么我在别人电脑上好装mastercam9,在自己电脑装不成功,它没有出现什么HASP驱动安装的提示,为什么...
- Oracle run leve,UNIX自动启动oracle
- C#LeetCode刷题之#448-找到所有数组中消失的数字(Find All Numbers Disappeared in an Array)
- java连接池域名切换_java - 使用JDBC的连接池选项:DBCP与C3P0
- docker部署mysql项目_Docker部署项目步骤
- 从零开始山寨Caffe·叁:全局线程管理器
- 拓端tecdat|R语言非参数模型厘定保险费率:局部回归、广义相加模型GAM、样条回归
- 不愧是阿里P8!黑马程序员java培训学费
- 如何计算离职率(2)?
- 一加nfc门禁卡录入_一加7t怎么开启NFC 模拟门禁卡方法介绍
- Application启动流程
- 【基础逻辑】对位乘法与升多项式子项根号——柯西不等式
- 21-7-09 主要元素
- 问题记录:Ubuntu中source运行.sh shell脚本报错:command not found 未找到命令
- 用EFS加密文件的方法
- Ti 官方文档阅读笔记
- [Demo]提取个人博客园闪存+评论
- L0范式、L1范式、L2范式解释通俗版
热门文章
- 莫比乌斯反演(bzoj 2301: [HAOI2011]Problem b)
- 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。
- 贺利坚老师汇编课程53笔记:寄存器冲突问题解决方案定义子程序标准框架
- 有关8086必须记住的几个数(持续更新)
- Python Linked List
- 购物车项目 复杂版本.待简化
- springcloud(八):配置中心服务化和高可用
- .Net Core中使用ref和SpanT提高程序性能
- IOS创建静态库Cocoa Touch Static Library
- Memcached在大型网站中应用[php 转载]