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;

效果如下:


结语

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

相关推荐
jndingxin3 小时前
OpenCV CUDA模块中矩阵操作------归一化与变换操作
人工智能·opencv
白熊1884 小时前
【计算机视觉】OpenCV实战项目:基于OpenCV的车牌识别系统深度解析
人工智能·opencv·计算机视觉
胡耀超5 小时前
霍夫圆变换全面解析(OpenCV)
人工智能·python·opencv·算法·计算机视觉·数据挖掘·数据安全
jndingxin5 小时前
OpenCV CUDA 模块中用于在 GPU 上计算两个数组对应元素差值的绝对值函数absdiff(
人工智能·opencv·计算机视觉
2201_754918418 小时前
OpenCV 图像透视变换详解
人工智能·opencv·计算机视觉
jndingxin10 小时前
OpenCV CUDA 模块中用于在 GPU 上计算矩阵中每个元素的绝对值或复数的模函数abs()
人工智能·opencv
Echo``12 小时前
1:OpenCV—图像基础
c++·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测
夏天是冰红茶13 小时前
图像处理:预览并绘制图像细节
图像处理·人工智能·opencv
2201_7549184120 小时前
OpenCV 背景建模详解:从原理到实战
人工智能·opencv·计算机视觉
jndingxin1 天前
OpenCV CUDA模块中矩阵操作------范数(Norm)相关函数
人工智能·opencv