使用OpenCV4.9的随机生成器和文本

 返回:OpenCV系列文章目录(持续更新中......)

上一篇:OpenCV 4.9基本绘图

下一篇:OpenCV系列文章目录(持续更新中......)

目标

在本教程中,您将学习如何:

  • 使用随机数生成器类 (cv::RNG) 以及如何从均匀分布中获取随机数。
  • 使用函数 cv::p utText 在 OpenCV 窗口上显示文本

法典

  • 在上一个教程(基本绘图)中,我们绘制了各种几何图形,并给出了坐标(以 cv::P oint 的形式)、颜色、厚度等输入参数。您可能已经注意到,我们为这些参数提供了特定的值。
  • 在本教程中,我们打算对绘图参数使用随机值。此外,我们打算用大量的几何图形填充我们的图像。由于我们将以随机方式初始化它们,因此此过程将是自动的,并使用 循环 .
  • 此代码位于 OpenCV 示例文件夹中。否则你可以从这里下载它

解释

 让我们从检查主要功能开始。我们观察到,我们做的第一件事是创建一个随机数生成器对象 (RNG):

 

RNG rng( 0xFFFFFFFF );

 

  1. RNG 实现了一个随机数生成器。在此示例中,rng 是使用值 0xFFFFFFFF 初始化的 RNG 元素
  2. 然后我们创建一个初始化为的矩阵(这意味着它将显示为黑色),指定其高度、宽度和类型:
Mat image = Mat::zeros( window_height, window_width, CV_8UC3 ); 
imshow( window_name, image );

然后我们继续画疯狂的东西。看一下代码后,可以看到它主要分为 8 个部分,定义为函数:

 
c = Drawing_Random_Lines(image, window_name, rng);
if( c != 0 ) return 0;c = Drawing_Random_Rectangles(image, window_name, rng);
if( c != 0 ) return 0;c = Drawing_Random_Ellipses( image, window_name, rng );
if( c != 0 ) return 0;c = Drawing_Random_Polylines( image, window_name, rng );
if( c != 0 ) return 0;c = Drawing_Random_Filled_Polygons( image, window_name, rng );
if( c != 0 ) return 0;c = Drawing_Random_Circles( image, window_name, rng );
if( c != 0 ) return 0;c = Displaying_Random_Text( image, window_name, rng );
if( c != 0 ) return 0;c = Displaying_Big_End( image, window_name, rng );
  1. 所有这些函数都遵循相同的模式,因此我们将只分析其中的几个,因为相同的解释适用于所有函数。
  2. 检出函数Drawing_Random_Lines:
int Drawing_Random_Lines( Mat image, char* window_name, RNG rng )
{int lineType = 8;Point pt1, pt2;for( int i = 0; i < NUMBER; i++ ){pt1.x = rng.uniform( x_1, x_2 );pt1.y = rng.uniform( y_1, y_2 );pt2.x = rng.uniform( x_1, x_2 );pt2.y = rng.uniform( y_1, y_2 );line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 );imshow( window_name, image );if( waitKey( DELAY ) >= 0 ){ return -1; }}return 0;
}

我们可以观察到以下几点:

  • for 循环将重复 NUMBER 次。由于函数 cv::line 位于此循环中,这意味着将生成 NUMBER 行。
  • 线极值由 pt1 和 pt2 给出。对于 pt1,我们可以看到:
  • pt1.x = rng.uniform( x_1, x_2 );
    pt1.y = rng.uniform( y_1, y_2 );
    • 我们知道 rng 是一个随机数生成器对象。在上面的代码中,我们调用 rng.uniform(a,b)。这将在值 a 和 b 之间生成随机均匀分布(在 a 中包含,在 b 中不占)。
    • 从上面的解释中,我们推断出极值 pt1 和 pt2 将是随机值,因此线的位置将非常不可预测,从而产生很好的视觉效果(查看下面的结果部分)。
    • 作为另一个观察结果,我们注意到在 cv::line 参数中,对于颜色输入,我们输入:
    • randomColor(rng)
      我们来检查一下函数实现:
      static Scalar randomColor( RNG& rng ){int icolor = (unsigned) rng;return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );}

正如我们所看到的,返回值是一个标,具有 3 个随机初始化的值,用作线条颜色的 RG 和 B 参数。因此,线条的颜色也是随机的!

上面的解释适用于生成圆形、椭圆、多边形等的其他函数。中心点等参数也是随机生成的。

在完成之前,我们还应该看一下 Display_Random_Text 和 Displaying_Big_End 函数,因为它们都有一些有趣的功能:

Display_Random_Text:

int Displaying_Random_Text( Mat image, char* window_name, RNG rng )
{int lineType = 8;for ( int i = 1; i < NUMBER; i++ ){Point org;org.x = rng.uniform(x_1, x_2);org.y = rng.uniform(y_1, y_2);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( window_name, image );if( waitKey(DELAY) >= 0 ){ return -1; }}return 0;
}

一切都很熟悉:

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);

那么,cv:::p utText 函数有什么作用呢?在我们的示例中:

  • 在图像中绘制文本**“测试文本呈现”**
  • 文本的左下角将位于 Point org 中
  • 字体类型是以下范围内的随机整数值: 。[0,8>
  • 字体的比例用表达式 rng.uniform(0, 100)x0.05 + 0.1 表示(表示其范围为:[0.1,5.1>)
  • 文本颜色是随机的(用 randomColor(rng) 表示))
  • 文本粗细介于 1 和 10 之间,由 rng.uniform(1,10) 指定

因此,我们将在随机位置获得(类似于其他绘图功能)图像上的 NUMBER 文本。

  1. Displaying_Big_End

    int Displaying_Big_End( Mat image, char* window_name, RNG rng )
    {Size textsize = getTextSize("OpenCV forever!", FONT_HERSHEY_COMPLEX, 3, 5, 0);Point org((window_width - textsize.width)/2, (window_height - textsize.height)/2);int lineType = 8;Mat image2;for( int 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( window_name, image2 );if( waitKey(DELAY) >= 0 ){ return -1; }}return 0;
    }

    除了函数 getTextSize(获取参数文本的大小)之外,我们可以观察到的新操作是在 foor 循环中:

    image2 = image - Scalar::all(i)

    因此,image2 是 image 和 Scalar::all(i) 的减法。 事实上,这里发生的事情是,image2 的每个像素都是减去图像的每个像素减去 i 值的结果(请记住,对于每个像素,我们考虑的是三个值,例如 R、G 和 B,因此每个值都会受到影响)

    还要记住,减法运算总是在内部执行饱和运算,这意味着获得的结果将始终在允许的范围内(在我们的示例中,没有负数,介于 0 和 255 之间)

结果

正如您刚才在“代码”部分看到的,程序将按顺序执行不同的绘图函数,这将产生:

  1. 首先,屏幕上将出现一组随机的 NUMBER 行,如以下屏幕截图所示:

  1. 然后,一组新的数字,这些时间矩形将随之而来。
  2. 现在将出现一些椭圆,每个椭圆的位置、大小、厚度和弧长都是随机的:

  1. 现在,具有 03 段的折线将再次以随机配置出现在屏幕上。

  1. 填充的多边形(在此示例中为三角形)将随之而来。
  2. 最后一个出现的几何图形:圆圈!

  1. 在接近尾声时,文本 *“Testing Text Rendering”* 将以各种字体、大小、颜色和位置出现。
  2. 还有大结局(顺便说一句,这也表达了一个大事实):


参考文献:

1、《Random generator and text with OpenCV》---Ana Huamán

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

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

相关文章

软件架构风格_2.调用/返回体系结构风格

调用/返回风格是指在系统中采用了调用与返回机制。利用调用-返回实际上是一种分而治之的策略&#xff0c;其主要思想是将一个复杂的大系统分解为若干子系统&#xff0c;以便降低复杂度&#xff0c;并且增加可修改性。程序从其执行起点开始执行该构件的代码&#xff0c;程序执行…

分发饼干(力扣455)

文章目录 题目贪心算法思想概述关键要素解题步骤优缺点优点缺点 应用领域 题解一、思路二、解题方法三、Code 总结 题目 Problem: 455. 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。对每个孩子 i&am…

2024 ccfcsp认证打卡 2023 05 01 重复局面

2023 05 01 重复局面 题目题解1题解2区别&#xff1a;数据存储方式&#xff1a;时间复杂度&#xff1a;空间复杂度&#xff1a; 总结&#xff1a; 题目 题解1 import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(Sys…

Stream 流和 Lambda 组装复杂父子树形结构

在最近的开发中&#xff0c;遇到了两个类似的需求&#xff1a;都是基于 Stream 的父子树形结构操作&#xff0c;返回 List 集合对象给前端。于是在经过需求分析和探索实践后有了新的认识&#xff0c;现在拿出来和大家作分享交流。 一般来说完成这样的需求大多数人会想到递归&a…

面试题 之 vue

1.vue里怎样实现双向数据绑定&#xff1f; Viewmodel 中的Domlisteners 工具会帮我们检测页面上Dom元素的变化&#xff0c;如果有变化&#xff0c;则更改Model中的数据&#xff0c;更新model中的数据时&#xff0c;数据事件绑定工具会帮我们更新页面中的Dom元素 2.Vue的响应式原…

3d代理模型怎么转换成标准模型---模大狮模型网

在当今的虚拟世界中&#xff0c;3D建模技术被广泛运用于游戏开发、电影制作、工业设计等领域。在3D建模过程中&#xff0c;有时会遇到需要将代理模型转换成标准模型的情况。模大狮将从理论和实践两方面&#xff0c;介绍如何将3D代理模型转换成标准模型&#xff0c;以帮助读者更…

【MySQL】事务是什么?事务的特性又是什么?

文章目录 ✍事务是什么&#xff1f;✍事务的特性&#xff08;四个&#xff09;✍事务并发时出现的问题✍事务的隔离性 ✍事务是什么&#xff1f; 事务是由一个或多个SQL语句构成的&#xff0c;在事务中&#xff0c;这些的SQL不可分割&#xff0c;是一个整体&#xff0c;整个事…

C++万物起源:类与对象(三)拷贝构造、赋值重载

目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中&#xff0c;我们可以将一个变量赋值给…

vue实现导出列表为xlsx文件

1.安装依赖 npm install --save xlsx file-saver 2.引入依赖 import FileSaver from file-saver; import * as XLSX from xlsx; 3.代码实现 <el-button type"primary" click"exportData">导出数据</el-button><el-tableid"table_ex…

怎样在Linux搭建NTP服务器

搭建 NTP&#xff08;Network Time Protocol&#xff09;服务器可以帮助你在局域网内提供时间同步服务&#xff0c;让网络中的设备都使用统一的时间。以下是在 Linux 系统上搭建 NTP 服务器的基本步骤&#xff1a; 安装 NTP 服务器软件&#xff1a; 在终端中执行以下命令安装 N…

JavaSE阶段十组易混淆概念总结

目录 &#x1f4cc; & 与 && &#x1f4cc; this 与 super &#x1f4cc; 方法重载与重写 &#x1f4cc; 抽象类与接口 &#x1f4cc; "" 与 equals &#x1f4cc; String 与 StringBuffer &#x1f4cc; HashSet 与 HashMap &#x1f4cc; Coll…

【CANN训练营笔记】Atlas 200I DK A2体验手写数字识别模型训练推理

环境介绍 开发板&#xff1a;Huawei Atals 200I DK A2 内存&#xff1a;4G NPU&#xff1a;Ascend 310B4 CANN&#xff1a;7.0 准备环境 下载编译好的torch_npu wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/wanzutao/torch_npu-2.1.0rc1-cp39-cp39-linux_aarch…

烂笔头笔记:Windows 11下照片查看器显示偏色问题修复

本文出处&#xff1a;http://blog.csdn.net/chaijunkun/article/details/137278931&#xff0c;转载请注明。由于本人不定期会整理相关博文&#xff0c;会对相应内容作出完善。因此强烈建议在原始出处查看此文。 最近在研究HDR视频的截图算法&#xff0c;目的就是生成色彩正确…

基于Springboot + MySQL + Vue 大学新生宿舍管理系统 (含源码)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; 管理员信息属性 &#x1f4ac; 学生信息实体属性 &#x1f4ac; 宿舍安排信息实体属性 &#x1f4ac; 卫生检查信息实体属性 &…

pytest--python的一种测试框架--接口测试

接口测试 工具&#xff1a; POSTMAN&#xff1b; 接口选择&#xff1a; 豆瓣电影&#xff0c;进制数据 POSTMAN下载&#xff1a; 1.POSTMAN官网&#xff1a;https://www.postman.com/products/&#xff1b; 2.点product选Download Postman 下载完之后双击打开就可以用的。…

Element-Plus日期选择组件封装农历日期

背景 在使用element-plus开发项目过程中&#xff0c;需要填入人员的生卒日期&#xff0c;经观察&#xff0c;对于大部分人来说&#xff0c;这类日期通常是农历日期&#xff0c;然而我们在系统建设过程中&#xff0c;对于日期字段&#xff0c;约定成俗的都会使用公历日期&#…

Lecture 1 - Introduction

Lecture 1 - Introduction MIT 6.824 Distributed Systems 1、概念预览 分布式系统需要考虑的因素&#xff1a; Parallelism &#xff1a;并行性Fault tolerence &#xff1a;容错性Physicial &#xff1a;不同系统之间物理距离引起的通信问题Security &#xff1a;不同的计…

封装一个vue3的公共组件

在Vue 3中&#xff0c;封装公共组件的场景包括但不限于以下几种情况&#xff1a; 重复使用的组件&#xff1a;如果你发现某个组件在多个地方重复使用&#xff0c;那么将其封装成公共组件是很有意义的。比如&#xff0c;页面中的各种表单控件&#xff08;输入框、下拉框、日期选…

MySQL 数据学习笔记速查表(视图、存储过程、事务)

文章目录 十三、视图1、视图是什么&#xff1f;2、视图的特性&#xff1f;3、视图的作用&#xff1f;4、视图的用途&#xff1f;5、视图的使用&#xff1f;1、基本语法2、创建视图3、调用视图4、视图练习(1) 利用试图简化复杂的联结(2) 利用视图重新格式化检索出的数据(3) 利用…

Django详细教程(一) - 基本操作

文章目录 前言一、安装Django二、创建项目1.终端创建项目2.Pycharm创建项目&#xff08;专业版才可以&#xff09;3.默认文件介绍 三、创建app1.app介绍2.默认文件介绍 四、快速上手1.写一个网页步骤1&#xff1a;注册app 【settings.py】步骤2&#xff1a;编写URL和视图函数对…