当前位置: 首页 > news >正文

Opencv-绘制几何图形

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.代码示例

#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, 100), Point(200, 100), Scalar(255, 255, 255), 2, 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(30,20), 0), 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);//绘制多边形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; 
}

 7. 程序运行结果

相关文章:

Opencv-绘制几何图形

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&#xff1a;需要绘制圆形的图像。 center&#xff1a;圆形的圆心位置坐标。 …...

ElasticSearch安装与集群部署

ElasticSearch安装与集群部署 很多小伙伴第一次接触ElasticSearch的时候是一脸愁容,这个东西他怎么用啊,不知道从哪里安装,那我们今天就着重从哪里下载?怎么下载?怎么安装?来研究一下吧! windows下载安装ElasticSearch 下载地址&#xff1a;https://www.elastic.co/cn/do…...

盘点12款企业常用源代码加密软件,源代码防泄密很重要!

在当今的商业环境中&#xff0c;源代码作为企业的核心资产之一&#xff0c;其安全性不容忽视。源代码的泄露可能导致企业丧失竞争优势、面临法律诉讼甚至经济损失。因此&#xff0c;选择合适的源代码加密软件成为企业保护知识产权和核心技术的关键步骤。 1. 安秉源代码加密软件…...

文件上传和下载

要想实现文件上传和下载&#xff0c;其实只需要下述代码即可&#xff1a; 文件上传和下载 import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.example.common.Result; import org.springframework.web.bind.annotation.*; import org.sprin…...

机械学习—零基础学习日志(高数22——泰勒公式理解深化)

核心思想&#xff1a;函数逼近 在泰勒的年代&#xff0c;如果想算出e的0.001次方&#xff0c;这是很难计算的。那为了能计算这样的数字&#xff0c;可以尝试逼近的思想。 但是函数又不能所有地方都相等&#xff0c;那退而求其次&#xff0c;只要在一个极小的范围&#xff0c;…...

Java | Leetcode Java题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; class Solution {public int maxProduct(String[] words) {Map<Integer, Integer> map new HashMap<Integer, Integer>();int length words.length;for (int i 0; i < length; i) {int mask 0;String word words[i];in…...

科普文:JUC系列之多线程门闩同步器Condition的使用和源码解读

一、概述 条件锁就是指在获取锁之后发现当前业务场景自己无法处理&#xff0c;而需要等待某个条件的出现才可以继续处理时使用的一种锁。 比如&#xff0c;在阻塞队列中&#xff0c;当队列中没有元素的时候是无法弹出一个元素的&#xff0c;这时候就需要阻塞在条件notEmpty上…...

Stable Diffusion绘画 | 图生图-基础使用介绍—提示词反推

按默认设置直接出图 拖入图片值图生图框中&#xff0c;保持默认设置&#xff0c;直接生成图片&#xff0c;出图效果如下&#xff1a; 因为重绘幅度0.7&#xff0c;所出图片与原图有差异&#xff0c;但整体的框架构图与颜色与原图类似。 输入关键词后出图 在正向提示词中输入…...

正点原子imx6ull-mini-Linux驱动之Linux SPI 驱动实验(22)

跟上一章一样&#xff0c;其实这些设备驱动&#xff0c;无非就是传感器对应寄存器的读写。而这个读写是建立在各种通信协议上的&#xff0c;比如上一章的i2c&#xff0c;我们做了什么呢&#xff0c;就是把设备注册成一个i2c平台驱动&#xff0c;这个i2c驱动怎么搞的呢&#xff…...

TypeScript 函数

函数是JavaScript应用程序的基础。 它帮助你实现抽象层&#xff0c;模拟类&#xff0c;信息隐藏和模块。 在TypeScript里&#xff0c;虽然已经支持类&#xff0c;命名空间和模块&#xff0c;但函数仍然是主要的定义 行为 的地方。 TypeScript为JavaScript函数添加了额外的功能&…...

C++ : namespace,输入与输出,函数重载,缺省参数

一&#xff0c;命名空间(namespace) 1.1命名空间的作用与定义 我们在学习c的过程中&#xff0c;经常会碰到命名冲突的情况。就拿我们在c语言中的一个string函数来说吧&#xff1a; int strncat 0; int main() {printf("%d", strncat);return 0; } 当我们运行之后&…...

目标检测 | yolov1 原理和介绍

1. 简介 论文链接&#xff1a;https://arxiv.org/abs/1506.02640 时间&#xff1a;2015年 作者&#xff1a;Joseph Redmon 代码参考&#xff1a;https://github.com/abeardear/pytorch-YOLO-v1 yolo属于one-stage算法&#xff0c;仅仅使用一个CNN网络直接预测不同目标的类别与…...

excel中有些以文本格式存储的数值如何批量转换为数字

一、背景 1.1 文本格式存储的数值特点 在平时工作中有时候会从别地方导出来表格&#xff0c;表格中有些数值是以文本格式存储的&#xff08;特点&#xff1a;单元格的左上角有个绿色的小标&#xff09;。 1.2 文本格式存储的数值在排序时不符合预期 当我们需要进行排序的时候…...

原神升级计划数据表:4个倒计时可以修改提示信息和时间,可以点击等级、命座、天赋、备注进行修改。

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>原神倒计时</title><style>* {margin: 0;padding: 0;box-sizing: border-box;body {background: #0b1b2c;}}header {width: 100vw;heigh…...

YoloV10 论文翻译(Real-Time End-to-End Object Detection)

​摘要 近年来&#xff0c;YOLO因其在计算成本与检测性能之间实现了有效平衡&#xff0c;已成为实时目标检测领域的主流范式。研究人员对YOLO的架构设计、优化目标、数据增强策略等方面进行了探索&#xff0c;并取得了显著进展。然而&#xff0c;YOLO对非极大值抑制&#xff0…...

第R1周:RNN-心脏病预测

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊 要求&#xff1a; 1.本地读取并加载数据。 2.了解循环神经网络&#xff08;RNN&#xff09;的构建过程 3.测试集accuracy到达87% 拔高&#xff1a; 1.测试集accuracy到达89% 我的环境&a…...

Golang | Leetcode Golang题解之第321题拼接最大数

题目&#xff1a; 题解&#xff1a; func maxSubsequence(a []int, k int) (s []int) {for i, v : range a {for len(s) > 0 && len(s)len(a)-1-i > k && v > s[len(s)-1] {s s[:len(s)-1]}if len(s) < k {s append(s, v)}}return }func lexico…...

远程连接本地虚拟机失败问题汇总

前言 因为我的 Ubuntu 虚拟机是新装的&#xff0c;并且应该装的是比较纯净的版本&#xff08;纯净是指很多工具都尚未安装&#xff09;&#xff0c;然后在使用远程连接工具 XShell 连接时出现了很多问题&#xff0c;这些都是我之前没遇到过的&#xff08;因为之前主要使用云服…...

WebRTC 初探

前言 项目中有局域网投屏与文件传输的需求&#xff0c;所以研究了一下 webRTC&#xff0c;这里记录一下学习过程。 WebRTC 基本流程以及概念 下面以 1 对 1 音视频实时通话案例介绍 WebRTC 的基本流程以及概念 WebRTC 中的角色 WebRTC 终端,负责音视频采集、编解码、NAT 穿…...

Python:read,readline和readlines的区别

在Python中&#xff0c;read(), readline(), 和 readlines() 是文件操作中常用的三个方法&#xff0c;它们都用于从文件中读取数据&#xff0c;但各自的使用方式和适用场景有所不同。 read() 方法&#xff1a; read(size-1) 方法用于从文件中读取指定数量的字符。如果指定了si…...

手把手教你为WCH CH582移植CherryUSB主机栈(基于RT-Thread,含中断优化)

基于RT-Thread的WCH CH582 USB主机协议栈深度移植指南在嵌入式开发领域&#xff0c;USB主机功能的实现往往意味着设备能够直接连接各类USB外设&#xff0c;从简单的键盘鼠标到复杂的存储设备。对于使用WCH CH582这类RISC-V内核MCU的开发者而言&#xff0c;原厂SDK提供的USB主机…...

如何从零构建智能FOC轮腿机器人:完整开源硬件系统终极指南

如何从零构建智能FOC轮腿机器人&#xff1a;完整开源硬件系统终极指南 【免费下载链接】foc-wheel-legged-robot Open source materials for a novel structured legged robot, including mechanical design, electronic design, algorithm simulation, and software developme…...

WarcraftHelper终极指南:魔兽争霸3兼容性问题一站式解决方案

WarcraftHelper终极指南&#xff1a;魔兽争霸3兼容性问题一站式解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3》在现代电…...

基于随机森林的低成本传感器机器学习校准实践指南

1. 项目概述&#xff1a;当低成本传感器遇上机器学习校准在物联网和智能感知系统铺天盖地的今天&#xff0c;低成本传感器几乎无处不在。从监测办公室的空气质量&#xff0c;到追踪城市街道的噪音污染&#xff0c;再到农业大棚里的温湿度控制&#xff0c;这些价格亲民的“小眼睛…...

巨量投放总结

巨量商务管理平台 &#xff1a; https://business.oceanengine.com 巨量广告投放平台&#xff1a; https://ad.oceanengine.com 商务管理平台 账户 广告组 计划 广告投放平台 层级关系: 广告组 -> 计划 -> 创意 对应FB: 系列 - > 广告组 -> 广告...

03 - 变量与数据类型

03 - 变量与数据类型 变量是编程里最基础的概念&#xff0c;相当于你往电脑里存东西的"容器"。这章我们把变量的命名规则、Python 的几种基本数据类型都过一遍。 变量是什么 说白了&#xff0c;变量就是一个有名字的盒子。你往里面放个东西&#xff0c;以后想用这个…...

基于MAX78000与CNN的智能螺栓巡检小车:嵌入式AI实战解析

1. 项目概述与核心思路在轨道交通的日常运维中&#xff0c;螺栓的紧固状态检查是一项繁重且关键的任务。无论是轨道上的紧固螺栓&#xff0c;还是列车转向架、轮对轴承上的关键螺栓&#xff0c;其松动或失效都可能引发严重的安全事故。传统的人工巡检方式不仅效率低下&#xff…...

机器学习的最佳实践:这7个原则让你的模型更稳定

对于软件测试从业者而言&#xff0c;机器学习技术正在快速融入测试流程&#xff1a;从自动化测试用例生成、缺陷预测到测试环境异常检测&#xff0c;机器学习模型的稳定性直接决定了测试结果的可靠性——如果模型在测试环境波动、输入数据变化时性能骤降&#xff0c;不仅无法提…...

树莓派Zero离线语音交互实战:TTS与STT引擎部署与优化

1. 项目概述&#xff1a;为什么选择树莓派 Zero 来实现语音功能&#xff1f;如果你玩过 Arduino、ESP32 这类微控制器&#xff0c;也接触过树莓派 4B 这样的单板电脑&#xff0c;那你大概能理解那种“选择困难症”&#xff1a;微控制器实时性强、功耗低&#xff0c;但算力有限&…...

从《王者荣耀》野怪巡逻到RTS单位集结:拆解Unity Navigation系统在实战中的4种高级用法

从《王者荣耀》野怪巡逻到RTS单位集结&#xff1a;拆解Unity Navigation系统在实战中的4种高级用法在MOBA游戏中&#xff0c;野怪沿着固定路线巡逻时突然转向追击玩家&#xff1b;RTS战场上&#xff0c;上百个单位向同一目标点移动却能保持整齐队形&#xff1b;潜行游戏中&…...