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

news2024/11/25 2:25:25

 返回: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.coloradmin.cn/o/1565863.html

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

相关文章

Java中的可变字符串

Java中的可变字符串 一、什么是可变字符串二、可变字符串的使用场景以及使用步骤1.新建一个可变字符串2.可变字符串的一系列方法 一、什么是可变字符串 可变字符串是Java.lang包下的 在我们学习到JDBC的时候需要将原有的sql语句根据不同的差异添加一段新的关键字或者单词&…

C语言_第一轮笔记_指针

8.1 密码开锁 地址和指针 一般以变量所在的内存单元的第一个字节的地址作为他的地址NULL的值为0&#xff0c;代表空指针 指针变量的定义 类型名 *指针变量名类型名指定指针变量所指向变量的类型指针声明符*在定义指针变量时被使用&#xff0c;说明被定义的那个变量是指针指针变…

护眼台灯十大排名品牌有哪些?2024护眼台灯十大排名品牌推荐

在当今的教育环境中&#xff0c;学生们面临着相当沉重的学业压力。放学后&#xff0c;许多孩子便投入到无休止的作业之中&#xff0c;常常夜深人静时还未完成。作为家长&#xff0c;孩子的视力健康自然成为了我们心中的一块大石。夜间学习时&#xff0c;灯光的质量至关重要。标…

批量转换图片神器,支持tiff图片转换成png格式,图片高效转换

在数字图像处理领域&#xff0c;格式转换一直是关键且必要的环节。尤其对于设计师、摄影师、网站开发者等专业人士来说&#xff0c;能够快速、高效地将图片从一种格式转换为另一种格式&#xff0c;是提升工作效率和保障项目质量的关键。今天&#xff0c;我们荣幸地向您推荐一款…

低压配电室数字孪生实现区域内的无人值守

众所周知&#xff0c;电力设备的精益管控、精益检修与精益维护对于电网智慧化转型的重要性。因此数字孪生公司深圳华锐视点利用精湛的数字孪生、虚拟仿真、3D建模和图形图像技术&#xff0c;集成数据采集、监控预警、计划维护、数据分析、决策支持等核心模块&#xff0c;为电力…

从零开始构建gRPC的Go服务

介绍 Protocol Buffers and gRPC是用于定义通过网络有效通信的微服务的流行技术。许多公司在Go中构建gRPC微服务&#xff0c;发布了他们开发的框架&#xff0c;本文将从gRPC入门开始&#xff0c;一步一步构建一个gRPC服务。 背景 之前在B站看过一个gRPC教学视频&#xff0c;…

Linux进程控制(改)

Linux进程控制 进程 内核数据结构&#xff08;struct task_struct,struct mm_struct,页表&#xff09; 代码和数据 在Linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程 1.进程创建 ./程序fork&am…

GPS坐标转换为百度地图坐标并显示到百度地图上

百度地图有个坐标识取系统&#xff1a;https://api.map.baidu.com/lbsapi/getpoint/index.html&#xff0c;打开链接如下&#xff1a; 如上图&#xff0c;可以搜索某一个位置&#xff0c;然后会出现该位置的许多选择&#xff0c;选择一个就会显示出对应的百度地图的坐标&#x…

抖音小店正确的起店方法是什么?别再闭门造车了,快来学习!

大家好&#xff0c;我是电商糖果 随着抖音卖货的火爆的&#xff0c;开抖音小店的商家也越来越多。 很多没有电商经验的朋友就发现&#xff0c;想要起店非常难。 有的好一两个月了&#xff0c;都不出单。 糖果做抖音小店有四年时间了&#xff0c;也经营了多家小店。 这里就…

从零开始:如何进入IT行业

微信扫码体验我自己做的小程序&#xff08;很有意思哦&#xff5e;&#xff5e;【坏笑】&#xff09;&#xff1a; 随着科技的飞速发展&#xff0c;IT行业已经成为了许多人梦寐以求的职业之一。不过&#xff0c;对于那些没有任何相关经验或技能的人来说&#xff0c;进入这个领域…

坦克大战_java源码_swing界面_带毕业论文

一. 演示视频 坦克大战_java源码_swing界面_带毕业论文 二. 实现步骤 完整项目获取 https://githubs.xyz/y22.html 部分截图 启动类是 TankClinet.java&#xff0c;内置碰撞检测算法&#xff0c;线程&#xff0c;安全集合&#xff0c;一切皆对象思想等&#xff0c;是java进阶…

filetype: python中判断图像格式库imghdr替代库

引言 imghdr库是python中的一个内置库&#xff0c;用来判断图像原本格式的。自己一直有在用&#xff0c;不过近来看到这个库在python 3.13中会被移除。 自己感觉一直被python版本赶着走。这不找了好久&#xff0c;才找到一个替代库–filetype Python各个版本将要移除和可替代…

IoT数采平台4:测试

IoT数采平台1&#xff1a;开篇IoT数采平台2&#xff1a;文档IoT数采平台3&#xff1a;功能IoT数采平台4&#xff1a;测试 Modbus RTU串口测试 OPC测试 HTTP测试 MQTT透传测试 MQTT网关测试及数据上报 TCP / UDP 监听&#xff0c;客户端连上后发送信息&#xff0c;客户端上报数据…

C语言杂谈

努力扩大自己&#xff0c;以靠近&#xff0c;以触及自身以外的世界 文章目录 什么是定义&#xff1f;什么是声明&#xff1f;什么是赋值&#xff1f;什么是初始化&#xff1f;什么是生命周期&#xff1f;什么是作用域&#xff1f;全局变量&#xff1f;局部变量&#xff1f;size…

MySQL数据库(数据库连接池)

文章目录 1.批处理应用1.基本介绍2.批处理演示1.创建测试表2.修改url3.编写java代码 3.批处理源码分析 2.数据库连接池1.传统连接弊端分析2.数据库连接池基本介绍1.概念介绍2.数据库连接池示意图3.数据库连接池种类 3.C3P0连接池1.环境配置1.导入jar包2.将整个lib添加到项目中3…

云存储属性级用户撤销可追溯的密文策略属性加密方案论文阅读

参考文献为2018年发表的Traceable ciphertext-policy attribute-based encryption scheme with attribute level user revocation for cloud storage 贡献 本篇路提出了一个可追踪、实现属性级用户撤销&#xff08;删除用户的某一属性&#xff09;、支持密钥更新和密文更新、外…

图片二维码如何制作生成?常规图片格式的二维码制作技巧

图片是展示信息很常用的一种方式&#xff0c;而现在查看图片很多人会通过二维码的形式来展现&#xff0c;这种方式优势在于更加的灵活&#xff0c;能够通过一个二维码展示大量的图片内容。那么图片二维码是如何制作生成的呢&#xff1f; 想要快速的将图片转二维码使用&#xf…

mysql-FIND_IN_SET包含查询

如图所示&#xff0c;需要查询字段ancestorid中包含14的所有数据&#xff0c;使用FIND_IN_SET即可实现&#xff0c;不需要使用模糊查找like 示例sql&#xff1a; SELECT * FROM mt_fire_template WHERE FIND_IN_SET(14,ancestorid) 结果

【pysurvival Python 安装失败】

这个错误与 sklearn 包的名称更改有关&#xff0c;导致 pysurvival 在构建元数据时失败。现在&#xff0c;你需要修改 pysurvival 的安装文件以使用正确的 scikit-learn 包名 编辑安装文件&#xff1a;找到 pysurvival 的安装文件&#xff0c;可能是 setup.py 或 pyproject.to…

一文解析智慧城市,人工智能技术将成“智”理主要手段

长期以来&#xff0c;有关智慧城市的讨论主要围绕在技术进步方面&#xff0c;如自动化、人工智能、数据的公开以及将更多的传感器嵌入城市以使其更加智能化。实际上&#xff0c;智慧城市是一个关于未来的设想&#xff0c;其重要原因在于城市中存在各种基础设施、政治、地理、财…