文章目录
- 前言
- putText (绘制文本)
- randn (正态分布随机数)
- randu(均匀分布随机数)
- randShuffle (数组随机重排)
- 结语
前言
本教程将介绍如何使用随机数生成器类RNG以及从均匀分布中获取随机数的方法。
您将学习如何在OpenCV窗口中使用PutText函数来显示文本。
在之前的教程中,我们为绘制几何图形提供了特定的参数值,如坐标(以Point的形式)、颜色和线宽等。但是,在本教程中,我们将使用随机值来设置参数,同时使用循环和大量的几何图形进行绘制。这将使整个过程自动化,并使图像具有不同的特点和样式。
putText (绘制文本)
这个函数可以在一个图像中绘制指定的文本字符串。当指定的字体无法显示某些字符时,这些字符将被替换为问号。通过调用getTextSize函数,可以得到一个文本渲染示例的代码。
putText接受多个参数,包括要绘制的图像、文本字符串、字符串的左下角坐标、字体类型(使用HersheyFonts),字体比例因子(与字体特定基本大小相乘),文本颜色、线条厚度以及线条类型。
在图像中绘制文本的位置是相对于指定左下角坐标的。
结构:
Imgproc.putText(Mat容器, 文本内容, 起始点, 字体类型, 字体大小, 颜色, 线厚度, 线类型);
例子:
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容器, 期望均值, 标准差);
例子:
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容器,下边界,上边界);
例子:
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容器)
例子:
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;
效果如下:
结语
本次的介绍到这里就结束啦,这样绘制图形有多了一个有利的工具啦。随着工具积累的越来越来我们也可以绘制出更多五彩斑斓的图形啦。