RNG类是OpenCV中的一个基本随机数生成工具

文章目录

RNG类是OpenCV中的一个基本随机数生成工具

在OpenCV中,RNG类是用于生成随机数的伪随机数生成器(Pseudo-Random Number Generator),它可以用于生成各种类型的随机数,如整数、浮点数和随机颜色,这个类位于 opencv2/core/types.hpp头文件中;

RNG可以产生3种随机数

  • RNG(int seed) 使用种子seed产生一个64位随机整数,seed默认-1
  • RNG::uniform( ) 产生一个均匀分布的随机数
  • RNG::gaussian( ) 产生一个高斯分布(又叫正态分布)的随机数
1、初始化一个RNG对象
cpp 复制代码
cv::RNG rng;  // 默认情况下随机数种子seed=-1,也可以指定随机数种子RNG rng(12345)
	      // rng既是一个RNG对象,也是一个随机整数
// 得到一个64位随机整数
int N1 = rng;
2、产生一个均匀分布的随机数
(1)产生一个[min_value, max_value)范围的均匀分布的整数
cpp 复制代码
int randomInt = rng.uniform(min_value, max_value);
(2)产生一个[min_value, max_value)范围的均匀分布的浮点数
cpp 复制代码
double randomDouble = rng.uniform(min_value, max_value);
示例:
cpp 复制代码
//总是得到double类型数据0.000000,因为会调用uniform(int,int),只会取整数,所以只产生0
double N1a = rng.uniform(0,1);

//产生[0,1)范围内均匀分布的double类型数据
double N1b = rng.uniform((double)0,(double)1);
 
//产生[0,1)范围内均匀分布的float类型数据,注意被自动转换为double了。
double N1c = rng.uniform(0.f,1.f);
 
//产生[0,1)范围内均匀分布的double类型数据。
double N1d = rng.uniform(0.,1.);
3、产生一个高斯分布(又叫正态分布)的随机数
cpp 复制代码
// 产生一个均值为0,标准差为1的正态分布的随机数
double g = rng.gaussian(1.0);
// 产生一个均值为0,标准差为2的正态分布的随机数  
double N1g = rng.gaussian(2); 
4、获取下一个随机数

上面一次只能返回一个随机数,实际上系统已经生成一个随机数组,如果我们要连续获得随机数,没有必要重新定义一个RNG类,只需要取出随机数组的下一个随机数即可;

  • RNG:: next 返回下一个64位随机整数
  • RNG:: operator 返回下一个指定类型的随机数
示例:
cpp 复制代码
RNG rng;
// 得到一个64位随机整数
int N1 = rng;
int N2 = rng.next();                    // 返回下一个随机整数,即N1.next();
 
//返回下一个指定类型的随机数
int N2a = rng.operator uchar();         //返回下一个无符号字符数
int N2b = rng.operator schar();         //返回下一个有符号字符数
int N2c = rng.operator ushort();        //返回下一个无符号短型
int N2d = rng.operator short int();     //返回下一个短整型数
int N2e = rng.operator int();           //返回下一个整型数
int N2f = rng.operator unsigned int();  //返回下一个无符号整型数
int N2g = rng.operator float();         //返回下一个浮点数
int N2h = rng.operator double();        //返回下一个double型数
int N2i = rng.operator ()();            //和rng.next( )等价
int N2j = rng.operator ()(100);         //返回[0,100)范围内的随机数
5、实例演示
cpp 复制代码
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {

	system("chcp 65001");

	Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
	int w = canvas.cols;
	int h = canvas.rows;
	RNG rng(12345);
	while (true) {
		int c = waitKey(10);
		if (c == 27) { // 退出
			break;
		}
		int x1 = rng.uniform(0, w);
		int y1 = rng.uniform(0, h);
		int x2 = rng.uniform(0, w);
		int y2 = rng.uniform(0, h);
		int b = rng.uniform(0, 255);
		int g = rng.uniform(0, 255);
		int r = rng.uniform(0, 255);
		canvas = Scalar(0, 0, 0);
		line(canvas, Point(x1, y1), Point(x2, y2), Scalar(b, g, r), 1, LINE_AA, 0);
		imshow("随机绘制演示", canvas);
	}

	waitKey();
	destroyAllWindows();
	return 0;
}
相关推荐
jndingxin6 小时前
OpenCV 图形API(31)图像滤波-----3x3 腐蚀操作函数erode3x3()
人工智能·opencv·计算机视觉
YOULANSHENGMENG7 小时前
使用opencv+python 实现图像的斜向矫正
opencv·计算机视觉
qp7 小时前
24.OpenCV中的霍夫直线检测
opencv·计算机视觉
新知图书7 小时前
OpenCV滑动条事件
人工智能·opencv·计算机视觉
2201_7549184110 小时前
OpenCv--换脸
人工智能·opencv·计算机视觉
绝顶大聪明16 小时前
图像预处理(OpenCV)-part2
人工智能·opencv·计算机视觉
Despacito0o16 小时前
OpenCV图像增强实战教程:从理论到代码实现
人工智能·opencv·计算机视觉
编码小哥17 小时前
OpenCV直方图均衡化全面解析:从灰度到彩色图像的增强技术
人工智能·opencv·计算机视觉
秣厉科技17 小时前
【秣厉科技】LabVIEW工具包——OpenCV 教程(19):拾遗 - imgproc 基础操作(上)
科技·opencv·labview
放羊郎1 天前
常用图像滤波及色彩调节操作(Opencv)
opencv·计算机视觉·图像滤波·图像模糊·颜色变换