Opencv-绘制几何图形

news2024/11/13 9:30:52

1. 绘制圆形

1.1 circle()函数原型

void cv::circle(InputOutputArray img, Point center, int radius, const Scalar & color, 
int thickness = 1, int lineType = LINE_8, int shift = 0 )

img:需要绘制圆形的图像。
center:圆形的圆心位置坐标。
radius:圆形的半径,单位为像素。
color:圆形的颜色。
thickness:轮廓的宽度,如果数值为负,则绘制一个实心圆。
lineType:边界的类型,可取值为 FILLED、LINE_4、LINE_8 和 LINE_AA。
shift:中心坐标和半径数值中的小数位数。 

        该函数用于在一幅图像中绘制圆形图案,输入的参数分别是圆形的圆心位置、半径,以及边界线的宽度和线型。

2. 绘制直线

2.1 line()函数原型

void cv::line(InputOutputArray img, Point pt1, Point pt2, const Scalar & color, 
int thickness = 1, int lineType = LINE_8, int shift = 0 )

pt1:直线起点在图像中的坐标。
pt2:直线终点在图像中的坐标。
color:直线的颜色,用三通道表示。

        该函数利用两点确定一条直线的方式在图像中画出一条直线,函数中很多参数的含义与circle() 函数一致,这里不再赘述。

3. 绘制椭圆

3.1 ellipse()函数原型

void cv::ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, 
double endAngle, const Scalar & color, int thickness = 1, int lineType = LINE_8, int shift = 0 )
center :椭圆的中心坐标。
axes:椭圆的长半轴和短半轴的长度
angle :椭圆旋转的角度,单位为度。
startAngle :椭圆弧起始的角度,单位为度。
endAngle :椭圆弧终止的角度,单位为度
        该函数通过选定椭圆中心位置和主轴大小唯一地确定一个椭圆,并且可以控制旋转角度改变椭圆在坐标系中的位置。通过椭圆弧起始和终止角度,可以绘制完整的椭圆或者一部分椭圆弧。与circle()函数一致,当边界线的厚度值为负数的时候,将绘制一个实心的椭圆。
        在 OpenCV 4 中,还提供了另一个名为 ellipse2Poly() 的函数用于输出椭圆边界的像素坐标,但 是不会在图像中绘制椭圆。

3.2 ellipse2Poly()函数原型

void cv::ellipse2Poly(Point center, 
Size axes, 
int angle, 
int arcStart, 
int arcEnd, 
int delta, 
std::vector< Point > & pts 
)

arcStart:椭圆孤起始的角度,单位为度。
arcEnd:椭圆弧终止的角度,单位为度。
delta:点与点之间的角度分辨率,其实就是对椭圆曲线的近似度。
pts:椭圆边缘像素坐标向量集合

        该函数与绘制椭圆需要输入的参数类似,只是不将椭圆输出到图像中,而是通过 vector (向量) 将椭圆边缘的坐标点存储起来,便于后续的再处理。

4. 绘制多边形

        在几何图形中,多边形也是一个重要的成员。在多边形中,矩形是一个比较特殊的类型,因此, 在 OpenCV 4 中,除提供绘制多边形的函数 fillPoly() 之外,也提供了绘制矩形的函数 rectangle() 。 我们先介绍矩形的绘制,之后再介绍多边形的绘制。

4.1 rectangle()函数原型

void cv::rectangle(InputOutputArray img, 
Point pt1, 
Point pt2, 
const Scalar & color, 
int thickness = 1, 
int lineType = LINE_8, 
int shift = 0 
)
void cv::rectangle(InputOutputArray img, 
Rect rec, 
const Scalar & color, 
int thickness = 1, 
int lineType = LINE_8, 
int shift = 0 
)

pt1:矩形的一个顶点。
pt2:矩形中与 pt1 相对的顶点,即两个点在对角线上。
rec:矩形左上角顶点和长宽。

        在 OpenCV 4 中定义了两种函数原型,分别利用矩形对角线上两个顶点的坐标或者利用左上角顶点坐标与矩形的长和宽唯一地确定一个矩形。在绘制矩形时,同样可以控制边缘线的宽度绘制一个实心的矩形。

        这里我们详细介绍 Rect 变量,该变量在 OpenCV 4中表示矩形的含义,与 PointVec3b 等类型相同,都是在图像处理中常用的类型。Rect 表示的是矩形的左上角像素坐标,以及矩形的长和宽,该类型定义的格式为 Rect(像素的 x 坐标,像素的 y 坐标,矩形的宽,矩形的高),其中可以存 放的数据类型也分别为 int 型(Rect2i 或者 Rect)、double 类型(Rect2d)和 float 类型(Rect2f)。

4.3 fillPoly()函数原型

void cv::fillPoly(InputOutputArray img, 
const Point ** pts, 
const int * npts, 
int ncontours, 
const Scalar & color, 
int lineType = LINE_8, 
int shift = 0, 
Point offset = Point() 
)

pts:多边形顶点数组,可以存放多个多边形的顶点坐标的数组。
npts:每个多边形顶点数组中顶点的个数。
ncontours:绘制多边形的个数。
offset:所有顶点的可选偏移。

        该函数中与前文含义相同的参数不再重复介绍。该函数通过依次连接多边形的顶点来实现多边 形的绘制,多边形的顶点需要按照顺时针或者逆时针的顺序依次给出,通过控制边界线宽度可以实现是否绘制实心多边形。需要说明的是,pts 参数是一个数组,数组中存放的是每个多边形顶点坐标数组,npts 参数也是一个数组,用于存放 pts 数组中每个元素中顶点的个数。

5. 文字生成

5.1 putText()函数原型

void cv::putText(InputOutputArray img, 
const String & text, 
Point org, 
int fontFace, 
double fontScale, 
Scalar color, 
int thickness = 1, 
int lineType = LINE_8, 
bool bottomLeftOrigin = false 
)

text:输出到图像中的文字,目前 OpenCV 4 只支持英文。
org:图像中文字字符串的左下角像素坐标。
fontFace:字体类型的选择标志、参数取值范围及含义在表 3-8 中给出。
fontScale:字体的大小。
bottomLeftOrigin:图像数据原点的位置。默认为左上角;如果参数改为 true,则原点为左下角。

        该函数中与前文含义相同的参数不再重复介绍。目前,该函数只支持英文的输出,如果要在图像中输出中文,那么需要添加额外的依赖项,这里不进行扩展,有需求的读者可以寻找相关资料进 一步地进行学习。

6.  RotatedRect函数介绍

RotatedRect(const Point2f& center, const Size2f& size, float angle);
center旋转矩形的质心
size旋转矩形的宽度和高度
angle顺时针方向的旋转角度。当角度为0°,90°,180°,270°等时,矩形变为右上方的矩形
RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);

 矩形的任意三个点。注意必须遵从逆时针或顺时针的顺序

7.代码示例

#include <opencv2/opencv.hpp> 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main() 
{ 
    Mat img = Mat::zeros(Size(512, 512), CV_8UC3); //生成一个黑色图像用于绘制几何图形
    //绘制圆形
    circle(img, Point(50, 50), 25, Scalar(255, 255, 255), -1); //绘制一个实心圆
    circle(img, Point(100, 50), 20, Scalar(255, 255, 255), 4); //绘制一个空心圆
    //绘制直线
    line(img, Point(100, 150), Point(200, 150), Scalar(255, 255, 255), 1, LINE_8,0); 
    line(img, Point(100, 200), Point(200, 200), Scalar(255, 255, 255), 1, LINE_4,0); 
    //绘制椭圆
    ellipse(img, Point(300,255), Size(100, 70), 0, 0, 100, Scalar(255,255,255), -1); 
    ellipse(img, RotatedRect(Point2f(150,100), Size2f(60,20), 90), Scalar(0,0,255),2); 
    vector<Point> points; 
    //用一些点来近似一个椭圆
    ellipse2Poly(Point(200, 400), Size(100, 70),0,0,360,2,points); 
    for (int i = 0; i < points.size()-1; i++) //用直线把这个椭圆画出来
    { 
        if (i==points.size()-1) 
        { 
            //椭圆最后一个点与第一个点连线
            line(img, points[0], points[i], Scalar(255, 255, 255), 2); 
            break; 
        } 
        //当前点与后一个点连线
        line(img, points[i], points[i+1], Scalar(255, 255, 255), 2); 
    } 
    //绘制矩形
    rectangle(img, Point(50, 400), Point(100, 450), Scalar(125, 125, 125), -1);   //实心
    rectangle(img, Rect(400,450,60,50), Scalar(0, 125, 125), 2);

    RotatedRect rRect = RotatedRect(Point2f(100, 100), Size2f(100, 50), 150);

    //绘制旋转矩形
    Point2f vertices[4];
	rRect.points(vertices);
	for (int i = 0; i < 4; i++)
		line(img, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2);


    RotatedRect rRect_1 = RotatedRect(Point2f(100, 100), Point2f(100, 150), Point2f(200,150));
    Point2f vertices_1[3];
    rRect_1.points(vertices_1);
	for (int i = 0; i < 3; i++)
		line(img, vertices_1[i], vertices_1[(i + 1) % 3], Scalar(0, 255, 0), 2);


    //绘制多边形
    Point pp[2][6]; 
    pp[0][0] = Point(72, 200); 
    pp[0][1] = Point(142, 204); 
    pp[0][2] = Point(226, 263); 
    pp[0][3] = Point(172, 310); 
    pp[0][4] = Point(117, 319); 
    pp[0][5] = Point(15, 260); 

    pp[1][0] = Point(359, 339); 
    pp[1][1] = Point(447, 351); 
    pp[1][2] = Point(504, 349); 
    pp[1][3] = Point(484, 433); 
    pp[1][4] = Point(418, 449); 
    pp[1][5] = Point(354, 402); 
    Point pp2[5]; 
    pp2[0] = Point(350, 83); 
    pp2[1] = Point(463, 90); 
    pp2[2] = Point(500, 171); 
    pp2[3] = Point(421, 194); 
    pp2[4] = Point(338, 141); 
    const Point* pts[3] = { pp[0],pp[1],pp2 }; //pts 变量的生成
    int npts[] = { 6,6,5 }; //顶点个数数组的生成
    fillPoly(img, pts, npts, 3, Scalar(125, 125, 125),8); //绘制 3 个多边形
    //生成文字
    putText(img, "Learn OpenCV 4",Point(100, 400), 2, 1, Scalar(255, 255, 255)); 
    imshow("img", img); 
    waitKey(0); 
    return 0; 
}

 8. 程序运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1994850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python中的 `continue` 语句:掌握循环控制的艺术

Python中的 continue 语句&#xff1a;掌握循环控制的艺术 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通…

国产数据库备份恢复实现

数据库备份恢复是数据库高可用的基本能力&#xff0c;如何通过备份数据快速高效的恢复业务并且满足不同场景下的恢复需求&#xff0c;是各数据库厂商需要关注的要点。本文将介绍几种国产数据库的备份恢复功能&#xff0c;以加深了解。 1、数据库备份恢复方案 数据库备份是生产…

为什么选择在Facebook投放广告?

2024年了你还没对 Facebook 广告产生兴趣&#xff1f;那你可就亏大了&#xff01; 今天这篇文章&#xff0c;我们会分享它对你扩大业务的好处。要知道&#xff0c;Facebook 广告凭借它庞大的用户群和先进的定位选项&#xff0c;已经是企业主们有效接触目标受众的必备神器。接下…

<数据集>固定视角监控牧场绵羊识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3615张 标注数量(xml文件个数)&#xff1a;3615 标注数量(txt文件个数)&#xff1a;3615 标注类别数&#xff1a;1 标注类别名称&#xff1a;[Sheep] 序号类别名称图片数框数1Sheep361529632 使用标注工具&#…

leetcode26_删除有序数组中的重复项

思路 双指针 func removeDuplicates(nums []int) int {if len(nums) < 2 {return len(nums)}// 双指针//区间 [0, slow] 代表已遍历且不重复元素//区间 [fast,len(nums)) 代表还未遍历的元素slow, fast : 0,1for ;fast < len(nums);{if nums[slow] ! nums[fast] {slown…

DICT运维服务目录

1、CT类项目或交付物的运维工作由网络条线负责,相关工作的SLA、流程、职责划分等按网络条线的相关制度执行 2、本服务目录主要面向IT部分的运维工作IT模式分类一级服务名称二级服务名称服务内容服务目标服务指标服务指标目标值建议工作结果呈现基础运维包增值服务指标参考费用…

【Qt】多种控件实现“hello world“

使用编辑框的方式实现"hello wordl" 使用编辑框实现"hello world"的方式有俩种&#xff1a; 单行编辑框&#xff1a;LineEdit多行编辑框&#xff1a;TextEdit 图形化界面 纯代码方式 代码展示&#xff1a; #include "widget.h" #include &qu…

Domcomp:省心好用的国外域名比价网站

先简单播报下今日奥运热点&#xff1a;1、金牌榜&#xff1a;中国29枚暂列第二&#xff1b;2、赛事预告&#xff1a;21&#xff1a;00央视5套乒乓男团决赛。言归正传&#xff0c;话说域名注册商Dynadot和NameSilo虽性价比较高&#xff0c;但也不能说域名价格每时每刻都是最低的…

RT-Thread 操作系统 之 线程间同步 IO设备模型

RT-Thread 操作系统 之 线程间同步 IO设备模型 一、线程间同步1.1、信号量1.1.1、信号量结构体1.1.2、信号量的使用和管理1.1.3、信号量同步例程 1.2、互斥量1.2.1、互斥量的使用和管理 1.3、事件集1.3.1、事件集使用和管理方法1.3.2、事件集三个线程同步实例 二、IO设备模型2.…

云手机在海外社交媒体运营中的作用

随着社交媒体的全球普及&#xff0c;海外社交媒体运营成为众多企业与个人提升品牌影响力和扩大市场份额的重要策略。在这一进程中&#xff0c;海外云手机以其独特的功能&#xff0c;为海外社交媒体运营提供了强大的支持。 那么&#xff0c;海外云手机在海外社交媒体运营中究竟扮…

UCOSIII的任务管理详解

前言 对于操作系统而言&#xff0c;最重要的就是任务的创建、挂起、删除和调度等&#xff0c;简单的创建任务可能大家都会&#xff0c;但是做大型项目的话&#xff0c;任务多了就可能需要对UCOSIII的任务管理做更深层次的一些理解。 一、任务状态 UCOSIII是单核系统&#xff…

【网络】协议,OSI参考模型,局域网通信,跨网络通信

1.协议 1.1.什么是协议/协议的由来&#xff1f; 这个就要回到我们说的阿帕网了&#xff01;&#xff01; 在阿帕网&#xff08;ARPA&#xff09;产生运作之初&#xff0c;通过接口信号处理机实现互联的电脑并不多&#xff0c;大部分电脑相互之间不兼容。 在一台电脑上完成的工…

贪心/前后缀优化dp,CF 575F - Bulbo

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 575F - Bulbo 二、解题报告 1、思路分析 F1 前后缀分离优化dp 点 的值域很大&#xff0c;但是线段数目很少&#xff0c;只有5000量级 也就是说最多有10000 个 不同的点 我们将所有点从小到大排序得到点集…

【python】OpenCV—Greedy Snake

文章目录 1、代码实现2、涉及到的库——cv2.setWindowProperty 1、代码实现 import cv2 import numpy as np from random import choiceclass SnakePart:def __init__(self, front, x, y):self.front frontself.x xself.y ydef move(self):# 跟随它前面的部分移动self.x s…

数据结构:链表经典算法OJ题

目录 前言 一、移除链表元素 二、反转链表 三、合并两个有序链表 四、链表的中间节点 五、环形链表的约瑟夫问题 前言 在了解了链表的相关知识后&#xff0c;我们还需要一些题目进行练习加深对链表这方面知识的理解&#xff0c;也可以用来检测链表这块学的的怎么样&#…

【手撕数据结构】二叉树和堆

目录 树的概念树的相关概念二叉树二叉树的概念满二叉树和完全二叉树 堆的概念与结构堆的向上调整算法思路分析代码详细解说 堆的向下调整算法算法图解分析代码详解分析 堆的各个接口堆的定义及声明堆的初始化堆的销毁堆的插入堆的删除取堆顶数据堆的数据个数堆的判空 树的概念 …

【CVE-2024-38077】核弹级Windows RCE漏洞如何自检并修复该漏洞(附批量漏洞检测工具及分析伪代码)

代码详细分析点击此处 # 伪代码分析链接 工具为官方工具&#xff0c;师傅可自行测试 深信服CVE-2024-38077漏洞扫描工具.exe Algorithm : SHA1Hash : 85ECBDB053950A20B9748E867586D059AAA19115Algorithm : SHA256Hash : 1BF3A372F95C4F5B2D776C6ABB1E9BCA51933C3…

机器学习·L3W2-协同过滤

推荐算法 推荐算法可以预测用户评分&#xff0c;并根据评分推荐数据 推荐算法与其他预测算法的区别在于&#xff1a;推荐算法中的数据大多都不完整&#xff0c;用户只对几个电影评分&#xff1b;而预测算法则要求数据完整&#xff0c;便于拟合和预测 协同过滤 评分矩阵Y&#x…

Install pytorch 使用 torch 的例子

如果不知道怎么开始和安装软件 从这里开始 如果需要GPU版本&#xff0c;请选择CUDA&#xff0c;而不是CPU PyTorchhttps://pytorch.org/ Python 3.8.13 | packaged by conda-forge | (default, Mar 25 2022, 06:04:10) [GCC 10.3.0] on linux Type "help", &quo…

k8s环境使用cronjob对mysql8进行备份

一、configmap 数据库备份脚本写入k8s环境的configmap文件&#xff0c;并生成config。 # cat mysql-back-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: mysql8backnamespace: crontabs data:mysql8back.sh: |#!/bin/bashDUMPDIR/tmp#backupbackupDatedate…