OpenCV4(C++)—— 几何图形的绘制

news2024/9/25 9:36:28

文章目录

  • 一、基本图形
    • 1、线
    • 2、线圆
    • 3、线椭圆
    • 4、矩形
  • 二、多边形


一、基本图形

1、线

绘制线,要给出两个点坐标

void cv::line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, 
int thickness = 1, int lineType = LINE_8, int shift = 0);
                
img:输入/输出图像,即要在其上绘制直线的图像。
pt1:直线的起始点坐标。
pt2:直线的结束点坐标。
color:直线的颜色,可以是 Scalar 类型表示的颜色值。
thickness:直线的厚度。默认值为1,表示单像素宽度。
lineType:线条类型,定义了边框的连接方式。默认值为LINE_8。
shift:坐标点的小数位数。默认值为0

2、线圆

绘制圆,要给出圆点和半径:

void cv::circle(InputOutputArray img, Point center, int radius, const Scalar& color,
                int thickness = 1, int lineType = LINE_8, int shift = 0);
                
img: 在该图像上进行绘制操作。可以是单通道或多通道图像。
center: 圆心坐标,指定圆的中心点位置,类型为 cv::Point 或 cv::Point2f。
radius: 圆的半径,指定圆的大小。
color: 圆的颜色,类型为 cv::Scalar,表示 BGR 颜色值。例如,红色可表示为 (0, 0, 255)thickness (可选): 表示绘制圆的线条粗细。默认值为 1。如果设为-1,则绘制一个实心圆
lineType (可选): 指定绘制线条的样式。默认值为 LINE_8,表示8连通线条。
shift (可选): 像素坐标的小数位数。默认值为 0

3、线椭圆

椭圆相比于圆,半径分成了半长轴和半短轴,并且有角度

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);
                
axes:椭圆的主轴尺寸,以半长轴和半短轴的大小表示。
angle:椭圆旋转角度(逆时针方向)。
startAngle:椭圆起始角度(以逆时针方向测量)。
endAngle:椭圆结束角度(以逆时针方向测量)。

4、矩形

绘制矩形,要给出左上角坐标和右下角坐标或者是左上角坐标和宽、高

第一种
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 rect, const Scalar& color, 
int thickness = 1, int lineType = LINE_8, int shift = 0);
                
pt1:矩形的左上角点坐标。
pt2:矩形的右下角点坐标

或者:cv::Rect(左上角点坐标,宽,高)

代码如下(示例):

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

using namespace std;

int main()
{
    cv::Mat mask = cv::Mat::zeros(cv::Size(640, 400), CV_8UC3);

    cv::line(mask, cv::Point2f(300, 300), cv::Point2f(400, 400), cv::Scalar(255, 255, 255), 3);  // 宽度为3的直线

    cv::circle(mask, cv::Point(30, 30), 10, cv::Scalar(255, 255, 255), 1);  // 空心圆
    cv::circle(mask, cv::Point(100, 30), 15, cv::Scalar(0, 0, 255), -1);   // 实心圆

    cv::ellipse(mask, cv::Point(150, 30), cv::Size(30, 15), 30, 0, 360, cv::Scalar(255, 0, 0), -1);  // 实心椭圆
  
    cv::rectangle(mask, cv::Point(200, 200), cv::Point(300, 300), cv::Scalar(0, 255, 0), 2);  // 矩形
    // cv::rectangle(mask, cv::Rect(200,200,100,100), cv::Scalar(0, 255, 0), 2);  // 矩形

    cv::imshow("原图", mask);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

在这里插入图片描述

二、多边形

在图像分割中,目标对象往往是不规则的形状。根据目标对象的多个顶点坐标来绘制(进行分割标签标注的时候,不就是在目标周围点很多个坐标吗)。

目前OpenCV4提供的绘制多边形的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());
 
第二种:
void fillPoly(InputOutputArray img, InputArrayOfArrays pts,
                           const Scalar& color, int lineType = LINE_8, int shift = 0,
                           Point offset = Point() );
                           
第一种:
pts:多边形顶点的数组指针,可以使用二维数组或vector来表示。每个多边形都由一组点组成。
npts:多边形顶点数目的整型数组指针,指定每个多边形的顶点数。
ncontours:多边形数量,即pts和npts数组中多边形的数量。

第二种:
上面三个参数统一为一个数组,存放所有多边形的坐标

color:填充的颜色,可以是 Scalar 类型表示的颜色值。
lineType:线条类型,定义了多边形轮廓的连接方式。默认值为LINE_8。
shift:坐标点的小数位数。默认值为0。
offset:偏移量,添加到所有顶点的坐标中。默认情况下为Point(),表示没有偏移。

比较简单和常用的是第二种构造方式,只需要给出所有要绘制的坐标就行。在实际应用中,目标对象的坐标是通过一些方法来捕获的,如findContours函数,与之对应的绘制函数还有一个drawContours(),后面用实例再一起说明。

代码如下(示例):

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

using namespace std;

int main()
{
    cv::Mat image(400, 400, CV_8UC3, cv::Scalar(0, 0, 0));
    
    std::vector<cv::Point> points1 = { cv::Point(50, 50), cv::Point(200, 100), cv::Point(150, 200) };
    std::vector<cv::Point> points2 = { cv::Point(250, 250), cv::Point(350, 300), cv::Point(300, 150) };
    std::vector<cv::Point> points3 = { cv::Point(100, 200), cv::Point(200, 300), cv::Point(150, 350) };

    std::vector<std::vector<cv::Point>> polygons;
    polygons.push_back(points1);
    polygons.push_back(points2);
    polygons.push_back(points3);

    cv::fillPoly(image, polygons, cv::Scalar(255, 0, 0));

    cv::imshow("Image", image);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

在这里插入图片描述

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

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

相关文章

【编程的黄金法则】适度注释,保持平衡

引言 身为一名程序员&#xff0c;你是否也曾为到底需不需要写注释而烦恼&#xff1f; 有些人认为&#xff0c;代码如诗&#xff0c;注释则是诗中的注解&#xff0c;能够帮助他人&#xff08;包括未来的你自己&#xff09;理解代码的意图。而另一些人则认为&#xff0c;好的代…

3D目标检测数据集 DAIR-V2X-V

本文分享国内场景3D目标检测&#xff0c;公开数据集 DAIR-V2X-V&#xff08;也称为DAIR-V2X车端&#xff09;。DAIR-V2X车端3D检测数据集是一个大规模车端多模态数据集&#xff0c;包括&#xff1a; 22325帧 图像数据22325帧 点云数据2D&3D标注 基于该数据集&#xff0c;可…

Excel 规范录入数据

文章目录 录入日期录入百分比 快捷键&#xff1a; tab&#xff1a;向右切换单元格 enter&#xff1a;向下切换行 shift tab&#xff1a;向左切换单元格 shiftenter&#xff1a;向上切换行 录入日期 输入今天的日期的快捷键&#xff1a;Ctrl ; 输入当时的时间的快捷键&a…

第二章:OSI参考模型与TCP/IP模型

OSI参考模型与TCP/IP模型 一、OSI参考模型二、TCP/IP模型2.1 四层分法&#xff08;书上&#xff09;2.2 五层分法&#xff08;实际厂商&#xff09;2.3 数据封装和解封装2.3.1 封装2.3.2 解封装2.3.3 TCP/IP分层封装2.3.4 数据封装和解封装过程 一、OSI参考模型 1.物理层 定义电…

[RoarCTF 2019]Easy Calc - RCE(函数输出)+参数waf绕过(PHP字符串解析特性)

[RoarCTF 2019]Easy Calc 1 解题流程2 思考总结 1 解题流程 打开页面让我们输入&#xff0c;输了没反应&#xff08;执行报错&#xff09;&#xff0c;F12发现js有代码$(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content&…

198、RabbitMQ 的核心概念 及 工作机制概述; Exchange 类型 及 该类型对应的路由规则

JMS 也是一种消息机制 AMQP ( Advanced Message Queuing Protocol ) 高级消息队列协议 ★ RabbitMQ的核心概念 Connection&#xff1a; 代表客户端&#xff08;包括消息生产者和消费者&#xff09;与RabbitMQ之间的连接。 Channel&#xff1a; 连接内部的Channel。 Exch…

【单片机】19-TFT彩屏

一、背景知识--显示器 1.什么是TFT &#xff08;1&#xff09;LCD显示器的构成&#xff1a;液晶面板驱动器【电压驱动】控制器【逻辑控制】 &#xff08;2&#xff09;液晶面板大致分为&#xff1a;TN&#xff0c;TFT&#xff0c;IPS等 &#xff08;3&#xff09;驱动器是跟随…

使用 Apache Kafka 进行发布-订阅通信中的微服务

发布-订阅消息系统在任何企业架构中都发挥着重要作用&#xff0c;因为它可以实现可靠的集成&#xff0c;而无需紧密耦合应用程序。在解耦的系统之间共享数据的能力并不是一个容易解决的问题。 考虑一家拥有多个使用不同语言和平台独立构建的应用程序的企业。它需要响应地共享数…

springboot医院HIS信息管理系统源码:技术架构:Angular+Nginx+Java+Spring,SpringBoot

医院信息管理系统HIS包括门&#xff08;急&#xff09;诊管理、住院管理、药库&#xff08;房&#xff09;管理、门诊电子处方、住院医嘱管理、电子病历、护理文书、病案管理等多个管理模块&#xff0c;涵盖了医疗信息管理的各个业务环节。在全院联网的基础上&#xff0c;把医院…

Photoshop与Web技术完美融合,Web版Photoshop已正式登场

通过WebAssembly Emscripten、Web Components Lit、Service Workers Workbox以及对新的Web API的支持&#xff0c;Chrome和Adobe之间的合作使得将Photoshop桌面应用程序引入Web成为了一项重大的里程碑。现在&#xff0c;您可以在浏览器上使用高度复杂和图形密集的软件&#…

mac M2芯片在使用Android studio 编译问题bad cpu type in executable android

由于mac的intel芯片的一些指令集没有同步在M1 M2芯片上所以需要做兼容 打开控制台&#xff08;通过访达 - 应用程序 - 实用工具 - 终端 &#xff09; 输入 softwareupdate --install-rosetta 之后在输入 A 就可以了。 原产考地址&#xff1a;硬核&#xff01;在 M1 芯…

HSRP热备份路由器协议的解析和配置

HSRP的解析 个人简介 HSRP hot standby router protocol 热备份路由协议&#xff08;思科私有协议&#xff09; HSRP v1 version 1 HSRP v2 version 2 虚拟一个HSRP虚拟IP地址 192.168.1.1 开启HSRP的抢占功能 通过其他参数 人为调整谁是主 谁是从 &#xff01; 查…

蓝桥杯每日一题20233.10.10

题目描述 回文日期 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题&#xff0c;我们最先想到的是暴力解法&#xff0c;将每一种情况经行循环查找&#xff0c;在查找的过程中记录下答案&#xff0c;回文日期就是字符串判断回文&#xff0c;ABABBABA型回文日期可以将回文经行特判…

【数字人】3、LIA | 使用隐式空间来实现视频驱动单张图数字人生成(ICLR 2022)

文章目录 一、背景二、方法2.1 latent motion representation2.2 latent code driven image animation2.3 学习方式2.4 推理 三、效果3.1 数据集3.2 训练细节3.3 评估3.4 定性效果3.5 定量效果3.6 消融实验3.7 失败示例 论文&#xff1a;Latent Image Animator: Learning to An…

C语言使用ip代码示例

以下是一个使用C语言编写的简单爬虫IP代码示例&#xff1a; c #include <stdio.h> #include <stdlib.h> #include <curl/curl.h> size_t write_callback_func(void *ptr, size_t size, size_t nmemb, void *stream) { size_t written fwrite(ptr, size…

掌握Python输入输出:从键盘到文件的全面指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python Python作为一门强大的编程语言&#xff0c;提供了丰富而灵活的输入输出&#xff08;I/O&#xff09;功能&#xff0c;使得与用户交互和数据处理变得轻而易举。 标准输入与标准输出 Python的输入输出从最基础的…

主从Reactor高并发服务器

文章目录 Reactor模型的典型分类单Reactor单线程单Reactor多线程多Reactor多线程本项目中实现的主从Reactor One Thread One Loop各模型的优点与缺点 项目分解Reactor服务器模块BufferSocketChannelEpollerTimerWheelEventLoopAnyConnectionAcceptorLoopThreadLoopThreadPoolTc…

如何进行前端单元测试?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Servlet的部署与安全

1 Servlet 部署 Servlet规范关于各个东西该放在哪里有许多严格的规则。 1.1 WAR war文件代表Web归档(Web Archive)&#xff0c;war实际就是一个JAR&#xff0c;只不过扩展名是.war而不是.jar。 其采用了一种可移植的压缩形式&#xff0c;把整个Web应用结构&#xff08;去掉…

知识图谱系列4:neo4j学习

这是一篇还不错的教程&#xff0c;我将会针对其中的Cypher语法在这篇帖子内提出问题&#xff0c;以便学习与复习。 MATCH是什么操作&#xff1f; 小括号()代表什么&#xff1f;&#xff08;n&#xff09;代表什么&#xff1f; MATCH (n) DETACH DELETE n是什么含义&#xff1…