【opencv】示例-drawing.cpp画线、箭头、矩形、多边形、椭圆、圆形以及在图像上渲染文本并通过循环实现动态绘制效果...

e3a523c0ced20cf4f4fc14b5c2b812ed.png

#include "opencv2/core.hpp" // 引入opencv2核心头文件
#include "opencv2/imgproc.hpp" // 引入opencv2图像处理头文件
#include "opencv2/highgui.hpp" // 引入opencv2高级GUI(head-up display)头文件
#include <stdio.h> // 引入标准输入输出头文件using namespace cv; // 使用cv命名空间// 帮助函数,用于打印程序说明
static void help(char** argv)
{printf("\nThis program demonstrates OpenCV drawing and text output functions.\n""Usage:\n""   %s\n", argv[0]);
}// 函数生成随机颜色,用于绘图
static Scalar randomColor(RNG& rng)
{int icolor = (unsigned)rng; // 生成随机数作为颜色值return Scalar(icolor&255, (icolor>>8)&255, (icolor>>16)&255); // 返回一个Scalar, 表示BGR颜色
}// 主函数
int main(int /* argc */, char** argv) // main函数,笔误argv用于命令行参数
{help(argv); // 调用help函数显示帮助char wndname[] = "Drawing Demo"; // 窗口名const int NUMBER = 100; // 定义数量常量const int DELAY = 5; // 定义延时常量int lineType = LINE_AA; // 定义线类型为抗锯齿线条,可以改为LINE_8查看非抗锯齿效果int i, width = 1000, height = 700; // 定义循环变量i以及窗口宽高int x1 = -width/2, x2 = width*3/2, y1 = -height/2, y2 = height*3/2; // 定义坐标范围RNG rng(0xFFFFFFFF); // 创建随机数生成器Mat image = Mat::zeros(height, width, CV_8UC3); // 创建一个黑色图像imshow(wndname, image); // 显示图像waitKey(DELAY); // 等待键盘输入// 绘制随机线条和箭头for (i = 0; i < NUMBER * 2; i++){Point pt1, pt2; // 定义两点pt1.x = rng.uniform(x1, x2); // 随机生成第一个点的x坐标pt1.y = rng.uniform(y1, y2); // 随机生成第一个点的y坐标pt2.x = rng.uniform(x1, x2); // 随机生成第二个点的x坐标pt2.y = rng.uniform(y1, y2); // 随机生成第二个点的y坐标int arrowed = rng.uniform(0, 6); // 随机决定是否画箭头if( arrowed < 3 )line( image, pt1, pt2, randomColor(rng), rng.uniform(1,10), lineType ); // 如果不画箭头, 绘制线条elsearrowedLine(image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), lineType); // 如果画箭头, 绘制箭头线条imshow(wndname, image); // 显示图像if(waitKey(DELAY) >= 0) // 如果按下任意键,则退出return 0;}// 绘制随机矩形和标记for (i = 0; i < NUMBER * 2; i++){Point pt1, pt2; // 定义矩形对角线上的两个点pt1.x = rng.uniform(x1, x2); // 随机生成点pt1的x坐标pt1.y = rng.uniform(y1, y2); // 随机生成点pt1的y坐标pt2.x = rng.uniform(x1, x2); // 随机生成点pt2的x坐标pt2.y = rng.uniform(y1, y2); // 随机生成点pt2的y坐标int thickness = rng.uniform(-3, 10); // 随机生成线条宽度int marker = rng.uniform(0, 10); // 随机决定绘制的形状是矩形还是标记int marker_size = rng.uniform(30, 80); // 随机生成标记的大小if (marker > 5)rectangle(image, pt1, pt2, randomColor(rng), MAX(thickness, -1), lineType);  // 如果marker大于5,则画一个矩形elsedrawMarker(image, pt1, randomColor(rng), marker, marker_size );  // 如果marker小于或等于5,则绘制一个标记imshow(wndname, image);  // 显示图像if(waitKey(DELAY) >= 0)  // 如果在DELAY时间内收到按键,结束程序return 0;}// 绘制椭圆for (i = 0; i < NUMBER; i++){Point center;  // 定义椭圆中心点center.x = rng.uniform(x1, x2);  // 随机生成中心点的x坐标center.y = rng.uniform(y1, y2);  // 随机生成中心点的y坐标Size axes;  // 定义椭圆的长轴和短轴axes.width = rng.uniform(0, 200); // 随机生成长轴的长度axes.height = rng.uniform(0, 200); // 随机生成短轴的长度double angle = rng.uniform(0, 180); // 随机生成椭圆的旋转角度ellipse( image, center, axes, angle, angle - 100, angle + 200,randomColor(rng), rng.uniform(-1,9), lineType );  // 画椭圆imshow(wndname, image);  // 显示图像if(waitKey(DELAY) >= 0)  // 如果在DELAY时间内收到按键,结束程序return 0;}// 绘制多边形线条for (i = 0; i< NUMBER; i++){Point pt[2][3]; // 定义多边形的顶点数组// 下面的部分是随机生成两个三角形的顶点pt[0][0].x = rng.uniform(x1, x2);pt[0][0].y = rng.uniform(y1, y2);pt[0][1].x = rng.uniform(x1, x2);pt[0][1].y = rng.uniform(y1, y2);pt[0][2].x = rng.uniform(x1, x2);pt[0][2].y = rng.uniform(y1, y2);pt[1][0].x = rng.uniform(x1, x2);pt[1][0].y = rng.uniform(y1, y2);pt[1][1].x = rng.uniform(x1, x2);pt[1][1].y = rng.uniform(y1, y2);pt[1][2].x = rng.uniform(x1, x2);pt[1][2].y = rng.uniform(y1, y2);const Point* ppt[2] = {pt[0], pt[1]}; // 创建指向顶点数组的指针数组int npt[] = {3, 3};  // 创建顶点数量数组polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1,10), lineType); // 绘制多边形的轮廓imshow(wndname, image);  // 显示图像if(waitKey(DELAY) >= 0)  // 如果在DELAY时间内收到按键,结束程序return 0;}// 填充多边形for (i = 0; i< NUMBER; i++){Point pt[2][3]; // 定义多边形的顶点数组// 下面的部分是随机生成两个三角形的顶点pt[0][0].x = rng.uniform(x1, x2);pt[0][0].y = rng.uniform(y1, y2);pt[0][1].x = rng.uniform(x1, x2);pt[0][1].y = rng.uniform(y1, y2);pt[0][2].x = rng.uniform(x1, x2);pt[0][2].y = rng.uniform(y1, y2);pt[1][0].x = rng.uniform(x1, x2);pt[1][0].y = rng.uniform(y1, y2);pt[1][1].x = rng.uniform(x1, x2);pt[1][1].y = rng.uniform(y1, y2);pt[1][2].x = rng.uniform(x1, x2);pt[1][2].y = rng.uniform(y1, y2);const Point* ppt[2] = {pt[0], pt[1]}; // 创建指向顶点数组的指针数组int npt[] = {3, 3};  // 创建顶点数量数组fillPoly(image, ppt, npt, 2, randomColor(rng), lineType);  // 填充多边形imshow(wndname, image);  // 显示图像if(waitKey(DELAY) >= 0)  // 如果在DELAY时间内收到按键,结束程序return 0;}// 绘制圆形for (i = 0; i < NUMBER; i++){Point center;  // 定义圆心center.x = rng.uniform(x1, x2); // 随机生成圆心的x坐标center.y = rng.uniform(y1, y2); // 随机生成圆心的y坐标circle(image, center, rng.uniform(0, 300), randomColor(rng),rng.uniform(-1, 9), lineType); // 画圆imshow(wndname, image);  // 显示图像if(waitKey(DELAY) >= 0)  // 如果在DELAY时间内收到按键,结束程序return 0;}// 在图像上绘制文字for (i = 1; i < NUMBER; i++){Point org; // 定义文字显示的位置org.x = rng.uniform(x1, x2); // 随机生成位置的x坐标org.y = rng.uniform(y1, y2); // 随机生成位置的y坐标putText(image, "Testing text rendering", org, rng.uniform(0,8),rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType); // 在图像上放置文字imshow(wndname, image);  // 显示图像if(waitKey(DELAY) >= 0)  // 如果在DELAY时间内收到按键,结束程序return 0;}// 绘制渐变文字“OpenCV forever!”Size textsize = getTextSize("OpenCV forever!", FONT_HERSHEY_COMPLEX, 3, 5, 0); // 获取文字尺寸Point org((width - textsize.width)/2, (height - textsize.height)/2); // 计算文字位置Mat image2; // 创建另一个图像for( i = 0; i < 255; i += 2 ) // 用循环绘制渐变效果{image2 = image - Scalar::all(i); // 使图像变暗putText(image2, "OpenCV forever!", org, FONT_HERSHEY_COMPLEX, 3,Scalar(i, i, 255), 5, lineType); // 绘制渐变文字imshow(wndname, image2); // 显示文字效果if(waitKey(DELAY) >= 0) // 如果按下任意键,则退出return 0;}waitKey(); // 等待键盘输入return 0; // 正常退出
}

此段代码是一段利用OpenCV库绘制各种图形和文字的C++示例程序。程序包括了画线、箭头、矩形、多边形、椭圆、圆形以及在图像上渲染文本,并通过循环实现动态绘制效果。使用了多种OpenCV函数,如linearrowedLinerectanglepolylinesfillPolycircleputText等。主要功能是展示OpenCV在图像处理中绘制图形和输出文本的能力。

01f6a099f77bd92026ab947f9e45800d.png

f33cff93e2705d3be8e42ebefdcfd9a3.png

line、arrowedLine、rectangle、polylines、fillPoly、circle和putText

66d6f54a041fa5bd66641bfe7df3aa02.png

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

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

相关文章

生成随机图片验证码

随着互联网的不断发展&#xff0c;安全性问题日益突出。为了保障用户账号的安全性&#xff0c;很多网站都引入了验证码机制。验证码是一种区分用户是计算机还是人的公共全自动程序&#xff0c;可以有效防止恶意攻击和自动化脚本的滥用。本文将介绍如何使用Python生成随机图片验…

论文笔记:面向实体的多模态对齐与融合网络假新闻检测

整理了2022TMM期刊 Entity-Oriented Multi-Modal Alignment and Fusion Network for Fake News Detection&#xff09;论文的阅读笔记 背景模型改进的动态路由算法Cross-Modal Fusion 实验 背景 现有的假新闻方法对多模态特征进行各种跨模态交互和融合&#xff0c;在检测常见假…

MT3022 召唤神龙

思路&#xff1a;二分答案 。check():检查组p套卡是否成立&#xff0c;即检查r卡是否足够组成p套卡。 &#xff08;易错点&#xff1a;check的思路&#xff0c;开long long&#xff09; #include <bits/stdc.h> using namespace std; long long int n, m; long long int…

【VScode】同时编辑多处

【VScode】同时编辑多处 1. 多光标自定义批量编辑2. 选择多个&#xff0c;同时操作(批量选中局部匹配项)3. 取消选择4. 在不移动光标的情况下滚动屏幕5. 批量选中全局匹配项6.重点6.1 通过上下键选择多行6.2 同时选中所有行的末尾6.3 选中多列另一种方式6.4 通过正则的方式配置…

东方博宜 1582. 马里奥的银币2

东方博宜 1582. 马里奥的银币2 思路&#xff1a;这道题好简单~ 注意的点是 n/2 要记得变成浮点数 n/2.0 或者 n*1.0/2 #include<iostream> using namespace std; int main() {int a[1001] ;int n ;cin >> n ;for(int i 0 ; i < n ; i){cin >> a[i] ;}…

C++奇迹之旅:探索类对象模型内存的存储猜想

文章目录 &#x1f4dd;前言&#x1f320; 类的实例化&#x1f309;类对象模型 &#x1f320; 如何计算类对象的大小&#x1f309;类对象的存储方式猜想&#x1f320;猜想一&#xff1a;对象中包含类的各个成员&#x1f309;猜想二&#xff1a;代码只保存一份&#xff0c;在对象…

CST电磁仿真基本单位设置和保存结果【仿真教程】

保存结果的Result Navigator 积累的结果一目了然&#xff01; 用户界面上的Result Navigator 在一个仿真工程中更改变量取值进行仿真分析或者改变设置进行仿真分析时&#xff0c;之前的1DResult会不会消失呢&#xff1f; 1D Result&#xff1a;CST中1D Result指的是Y值取决…

VirusTaxo:病毒物种注释

https://github.com/omics-lab/VirusTaxo 安装 git clone https://github.com/omics-lab/VirusTaxo mamba create -n VirusTaxo python3.10 mamba activate VirusTaxo cd VirusTaxo python3 -m venv environment source ./environment/bin/activate pip install -r require…

DSP笔记12-PWM基础知识及EPWM

PWM pulse width modulation 脉冲宽度调制&#xff0c;宽度可调节的方波脉冲&#xff0c;驱动开关器件&#xff0c; 参数&#xff1a; 1.频率f 1kHz&#xff0c;2kHz开关损耗 2.周期T 3.幅值&#xff0c;高低电平之间电压 gpio输出3.3V&#xff0c;转换成5V高电平输出 4.占…

使用Springboot配置生产者、消费者RabbitMQ?

生产者服务 1、引入依赖以及配置rabbitmq 此时我们通过使用springboot来快速搭建一个生产者服务 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> applica…

规则引擎之LiteFlow应用

官网地址&#xff1a;LiteFlow DEMO 整体结构 1.引入maven依赖 <dependency><groupId>com.yomahub</groupId><artifactId>liteflow-spring-boot-starter</artifactId><version>2.11.4.2</version> </dependency> 2. 配置yml …

Linux--进程的概念(一)

目录 一、冯诺依曼体系结构二、操作系统2.1 什么是操作系统2.2 操作系统的意义 三、进程3.1 进程的基本概念3.2 描述进程——PCB3.3 进程和程序的区别3.4 task_struct-PCB的一种3.5 task_struct的内容分类 四、如何查看进程4.1 通过系统文件查看进程4.2 通过ps指令查看进程 五、…

uni-app项目创建方式

原生小程序与uni-app的区别 创建uni-app的方式 1.通过HBuilderX创建 2.通过命令行创建 vue3ts版&#xff1a;npx degit dcloudio/uni-preset-vue#vite-ts 项目名称 用vscode开发uni-app项目 安装命令&#xff1a;npm i -D types/wechat-miniprogram uni-helper/uni-app-typ…

大话设计模式——17.状态模式(State Pattern)

简介 对象的行为依赖于它的状态&#xff08;属性&#xff09;&#xff0c;可以根据状态的改变而改变相关行为。 UML图&#xff1a; 应用场景&#xff1a; 对象的行为取决于其状态&#xff0c;并且必须要在运行时刻根据状态而改变行为代码中包含大量与对象状态有关的条件语句 …

4月10日(信息差)

快捷新闻&#xff1a; &#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 地震预警App被曝收10元年费&#xff0c;回应称仅限苹果系统 &#x1f30d; 2024清明档首日票房破2亿 &#x1f30b; 浙江省杭州市余杭区设立2亿元网络微短剧发展基金 &#x1f381; 抖音拟以超 7…

小狐狸转账失败,提示gas费过高

做web3开发的时候&#xff0c;明明自己小狐狸里还有2.15的代币&#xff0c;但页面我要转出2.1的时候&#xff0c;明明是够的&#xff0c;而且使用小狐狸提示gas费用是21000&#xff0c;这已经是最小的了&#xff0c;但网页转出到其他账户总是提示失败。而且这个错误非常不好捕获…

使用OMP复原一维信号(MATLAB)

参考文献 https://github.com/aresmiki/CS-Recovery-Algorithms/tree/master MATLAB代码 %% 含有噪声 % minimize ||x||_1 % subject to: (||Ax-y||_2)^2<eps; % minimize : (||Ax-y||_2)^2lambda*||x||_1 % y传输中可能含噪 yyw % %% clc;clearvars; close all; %% 1.构…

【Redis】底层跳表实现

先巩固Redis的数据类型以及底层的数据结构&#xff1a; ZSet&#xff08;有序集合&#xff09;可以使用两种不同的内部数据结构来表示&#xff1a;压缩列表&#xff08;ziplist&#xff09;和跳跃表&#xff08;skiplist&#xff09;。 跳表是redis底层SortedSet(ZSet)的数据…

深入理解nginx realip模块[上]

目录 1. 引言2. Real IP模块的使用2.1 启用Real IP模块2.2 配置Real IP模块2.2.1 配置指令2.2.2 举例 3. 变量的使用 深入理解nginx realip模块[上] 深入理解nginx realip模块[下] 1. 引言 nginx 的 Real IP 模块用于解决代理服务器转发请求到nginx上时可能出现的 IP 地址问题…

C++11 如何优雅地封装线程库以实现多线程编程

在C11标准中&#xff0c;多线程编程被正式纳入语言规范&#xff0c;通过引入 <thread> 头文件&#xff0c;C为开发者提供了一套统一且高效的线程API。std::thread 是 C11 标准库中用于创建和管理线程的核心类。本文将详细介绍C11是如何封装Thread库&#xff0c;以及如何通…