使用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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 移植 LVGL -- 教程图解

&#xff08; 编辑状态中&#xff0c;已完成80%&#xff0c;估计清明假期后完成更新 ) 移植效果&#xff0c;先睹为快&#xff1a; 目录 一、LVGL 简述 二、准备一个STM32的工程 三、LVGL 官方下载 四、裁剪 源文件 五、添加 源文件 六、注册 显示 七、注册 触摸输入 八…

【flutter封装图片/视频选择控件】

引入库 wechat_assets_picker: ^6.0.5 、video_player: ^2.5.1 # 视频播放、 flutter_screenutil: ^5.7.0 import dart:async; import dart:io; import package:generated/l10n.dart; import package:jade/configs/PathConfig.dart; import package:jade/customWidget/addImag…

The Sandbox 的伙伴们| K-verse 3: Eternal Fandom 的合作伙伴介绍

准备好参加韩国合作伙伴最盛大的聚会吧&#xff0c;就在The Sandbox&#xff01;这是一个前所未有的与你最喜爱的品牌建立联系的绝佳机会。 Otherworld Web 3.0 社交 "Otherworld "的首个数字空间 国内领先网络动漫和娱乐 IP 汇聚并扩展的元宇宙 Otherworld 正在为 …

高级DBA带你解决Mysql主从集群主库产生过多binlog文件引起生产服务器硬盘爆满处理方法实战全网唯一

高级DBA带你解决Mysql主从集群产生过多binlog文件引起生产服务器硬盘爆满处理方法实战全网唯一 一、事故描述 生产环境数据库服务器突然硬盘爆满报警&#xff0c;业务停止&#xff0c;监控短信过来了&#xff0c;一看硬盘满了&#xff0c;再看数据库文件路径一大堆binlog文件…

Redis 主从复制,哨兵模式,集群

目录 主从复制 主从复制 作用 缺陷 主从复制流程 实现Redis主从复制 哨兵模式 主从复制切换的缺点 哨兵的核心功能 哨兵模式原理 哨兵模式的作用 哨兵结构组成 故障转移机制 主节点的选举 实现哨兵模式 集群(Cluster) redis群集有三种模式&#xff0c;主从复制…

Leetcode-894-所有可能的真二叉树-c++

题目详见https://leetcode.cn/problems/all-possible-full-binary-trees/ 主搞动态规划&#xff0c;因为这玩意儿我还不是很懂 关于节点个数为奇数偶数的证明请见官方题解方法一中的如下内容&#xff1a; 这里DP的一个主要思想是&#xff1a;对于任何一个满二叉树&#xff…

算法学习——LeetCode力扣动态规划篇9(1035. 不相交的线、53. 最大子数组和、392. 判断子序列、115. 不同的子序列)

算法学习——LeetCode力扣动态规划篇9 1035. 不相交的线 1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 描述 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#x…

网站可扩展架构设计——中台

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、中台简介 1.传统项目架构的痛点 (1)重复造轮子 各项目相对独立&#xff0c;许多项目在重复造轮子&#xff0c;让项目本身越来越臃肿&#xf…

外卖配送时间预测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 项目背景 外卖服务的兴起: 随着互联网技术和移动应用的发展&#xff0c;外卖成为一种日益普及的餐饮服务方式。顾客通过餐厅、杂货店的网站或移…

OpenHarmony Neptune开发板-MQTT连接华为IoT平台

本示例将演示如何在Neptune开发板上使用MQTT协议连接华为IoT平台,使用的是ATH20温湿度传感器模块与Neptune开发板 本示例实现AHT20温湿度数据上报华为IoT平台,IoT平台下发命令控制LED灯的开关 使用W800 SDK功能包中libemqtt来实现连接华为IoT平台 程序设计 初始化 一、MQT…

Stable Diffusion 模型下载:CyberRealistic(真实)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;订阅后可阅读专栏内所有文章&#xff0c;专栏总目录•点这里 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 这是经过严格测试过程的结果&#xff0c;该过程混合了各种模型…

存储故障处理流程演变

存储作为存放金融企业数据中心各类生产数据的重要载体&#xff0c;其日常的安全平稳运行至关重要。特别是应对若干存储的大量告警&#xff0c;如何从大量告警中提取关键告警消息并及时处理异常&#xff0c;可谓对存储平台的稳定运行起到保驾护航的作用。 存储告警处理作为常规…

如何监控特权帐户,保护敏感数据

IT基础设施的增长导致员工可以访问的凭据和资源数量急剧增加。每个组织都存储关键信息&#xff0c;这些信息构成了做出关键业务决策的基石。与特权用户共享这些数据可以授予他们访问普通员工没有的凭据的权限。如果特权帐户凭证落入不法分子之手&#xff0c;它们可能被滥用&…

2024最新AI创作系统ChatGPT源码+Ai绘画网站源码,GPTs应用、AI换脸、插件系统、GPT文档分析、GPT语音对话一站式解决方案

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

Ai音乐大师演示(支持H5、小程序)独立部署源码

Ai音乐大师演示&#xff08;支持H5、小程序&#xff09;独立部署源码

Python网络爬虫(三):Selenium--以携程酒店为例

1 Selenium简介 Selenium是一个用于网站应用程序自动化的工具&#xff0c;它可以直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。它相当于一个机器人&#xff0c;可以模拟人类在浏览器上的一些行为&#xff0c;比如输入文本、点击、回车等。Selenium支持多种浏览器&…

Linux结构目录详解

Linux 在Linux中&#xff0c;系统默认的用户是root&#xff0c;其实和 windows 的 administrator 类似&#xff0c;root 用户可以操作操作系统的任何文件和设备&#xff0c;所以在生产环境就不要乱用root了&#xff0c;权利越大&#xff0c;责任越大。 学习Linux&#xff0c;…

C++ 项目:使用 GSL 数学运算库 C++ 调用Python

文章目录 Part.I IntroductionChap.I CMakeListsChap.II ExportLibGSL.hChap.III test_python.cpp Part.II GSL 使用方法Part.III C 调用 Python 使用方法相关博客 Part.I Introduction 本文是一个项目的使用教程&#xff0c;此项目是一个使用 GSL 的小项目&#xff0c;还有 C…

Solana 线下活动回顾|多方创新实践,引领 Solana“文艺复兴”新浪潮

Solana 作为在过去一年里实现突破式飞跃的头部公链&#xff0c;究竟是如何与 Web3 行业共振&#xff0c;带来全新的技术发展与生态亮点的呢&#xff1f;在 3 月 24 日刚结束的「TinTin Destination Moon」活动现场&#xff0c;来自 Solana 生态的的专家大咖和 Web3 行业的资深人…

基于lora技术微调Gemma(2B)代码实践

一、前置条件 获得模型访问权&#xff0c;选择Colab运行时&#xff0c;配置训练环境。 先在Kaggle上注册&#xff0c;然后获得Gemma 2B 的访问权&#xff1b; 然后在Google colab 配置环境&#xff0c;主要是GPU的选择&#xff0c;免费的是T4&#xff0c;建议采用付费的A100…