OpenCVForUnity(八)文本与随机数

文章目录

  • 前言
  • [putText (绘制文本)](#putText (绘制文本))
  • [randn (正态分布随机数)](#randn (正态分布随机数))
  • randu(均匀分布随机数)
  • [randShuffle (数组随机重排)](#randShuffle (数组随机重排))
  • 结语

前言

本教程将介绍如何使用随机数生成器类RNG以及从均匀分布中获取随机数的方法。

您将学习如何在OpenCV窗口中使用PutText函数来显示文本。

在之前的教程中,我们为绘制几何图形提供了特定的参数值,如坐标(以Point的形式)、颜色和线宽等。但是,在本教程中,我们将使用随机值来设置参数,同时使用循环和大量的几何图形进行绘制。这将使整个过程自动化,并使图像具有不同的特点和样式。


putText (绘制文本)

这个函数可以在一个图像中绘制指定的文本字符串。当指定的字体无法显示某些字符时,这些字符将被替换为问号。通过调用getTextSize函数,可以得到一个文本渲染示例的代码。

putText接受多个参数,包括要绘制的图像、文本字符串、字符串的左下角坐标、字体类型(使用HersheyFonts),字体比例因子(与字体特定基本大小相乘),文本颜色、线条厚度以及线条类型。

在图像中绘制文本的位置是相对于指定左下角坐标的。

结构:

Imgproc.putText(Mat容器, 文本内容, 起始点, 字体类型, 字体大小, 颜色, 线厚度, 线类型);

例子:

csharp 复制代码
Mat inputMat = new Mat(512, 512, CvType.CV_8UC4);
Imgproc.putText(inputMat, "Test", new Point(256, 256), 1, 5, new Scalar(255, 0, 0), 5, 8);
Texture2D putTextTexture = new Texture2D(inputMat.cols(), inputMat.rows(), TextureFormat.RGB24, false);
Utils.matToTexture2D(inputMat, putTextTexture);
GameObject.Find("Cube1").GetComponent<Renderer>().material.mainTexture = putTextTexture;

上面我们绘制了一个文本,效果如下:


randn (正态分布随机数)

这个函数会生成正态分布随机数,并填充到指定的数组中。用户需要提供目标数组,以及期望的均值向量和标准差矩阵。

生成的随机数会被剪切到输出数组的值范围内。目标数组必须预先分配并具有1到4个通道。

标准差矩阵可以是向量(此时假定为对角矩阵),也可以是方阵。

更多随机数生成函数可以参考RNG和randu。

结构:

Core.randn(Mat容器, 期望均值, 标准差);

例子:

csharp 复制代码
Mat randnMat = new Mat(32, 32, CvType.CV_8UC4);
Core.randn(randnMat, 0, 128);
Texture2D randnTexture = new Texture2D(randnMat.cols(), randnMat.rows(), TextureFormat.RGB24, false);
Utils.matToTexture2D(randnMat, randnTexture);
GameObject.Find("Cube2").GetComponent<Renderer>().material.mainTexture = randnTexture;

效果如下:


randu(均匀分布随机数)

它可以生成单个或多个均匀分布随机数。该函数的非模板版本将目标数组(dst)填充为从指定范围内取出的均匀分布随机数.

用户需要提供目标数组(dst),以及生成随机数的上下边界。生成的随机数是左闭右开区间内的实数。目标数组必须预先分配。

还有模板版本的randu函数可以生成更通用的随机数,更多带有随机性的函数可以参看RNG和randn。

结构:

Core.randu(Mat容器,下边界,上边界);

例子:

csharp 复制代码
Mat randuMat = new Mat(32, 32, CvType.CV_8UC4);
Core.randu(randuMat, 0, 128);
Texture2D randuTexture = new Texture2D(randuMat.cols(), randuMat.rows(), TextureFormat.RGB24, false);
Utils.matToTexture2D(randuMat, randuTexture);
GameObject.Find("Cube3").GetComponent<Renderer>().material.mainTexture = randuTexture;

效果如下:


randShuffle (数组随机重排)

它可以将指定的一维数组随机重排。函数通过随机选择数组中的元素对并进行交换来实现重排。函数将会进行 dst.rowsdst.colsiterFactor 次这样的交换操作。

用户需要提供一个数值型的一维数组作为输入。另外,注意到此版本的 randShuffle 是一个比较古老的API,OpenCV的开发者建议使用更加通用的 shuffle 函数来代替。

更多相关函数可以使用RNG和sort来进行学习和探索。
结构:

Core.randShuffle(Mat容器)
例子:

csharp 复制代码
Mat randShuffleMat = new Mat(32, 32, CvType.CV_8UC4);
Core.randShuffle(randShuffleMat);
Texture2D randShuffleTexture= new Texture2D(randShuffleMat.cols(), randShuffleMat.rows(), TextureFormat.RGB24, false);
Utils.matToTexture2D(randShuffleMat, randShuffleTexture);
GameObject.Find("Cube4").GetComponent<Renderer>().material.mainTexture = randShuffleTexture;

效果如下:


结语

本次的介绍到这里就结束啦,这样绘制图形有多了一个有利的工具啦。随着工具积累的越来越来我们也可以绘制出更多五彩斑斓的图形啦。

相关推荐
彭祥.2 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
Tony沈哲3 小时前
macOS 上为 Compose Desktop 构建跨架构图像处理 dylib:OpenCV + libraw + libheif 实践指南
opencv·算法
视觉人机器视觉12 小时前
Visual Studio2022和C++opencv的配置保姆级教程
c++·opencv·visual studio
PyAIExplorer12 小时前
图像旋转:从原理到 OpenCV 实践
人工智能·opencv·计算机视觉
PyAIExplorer18 小时前
OpenCV 图像操作:颜色识别、替换与水印添加
人工智能·opencv·计算机视觉
whoarethenext1 天前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc
jndingxin1 天前
OpenCV CUDA模块设备层-----高效地计算两个 uint 类型值的带权重平均值
人工智能·opencv·计算机视觉
晨同学03271 天前
opencv的颜色通道问题 & rgb & bgr
人工智能·opencv·计算机视觉
看到我,请让我去学习1 天前
OpenCV开发-初始概念
人工智能·opencv·计算机视觉
PyAIExplorer1 天前
基于 OpenCV 的图像 ROI 切割实现
人工智能·opencv·计算机视觉