【OpenCV C++20 学习笔记】随机数生成器RNG

RNG类概述

RNG类定义在OpenCV的core模块中。

+state
unit64_t
cv::RNG
+unit64 state
+RNG()
+RNG(unit64 state)
+fill()
+gaussian() : double
+next() : unsigned
+operator double()
+operator float()
+operator schar()
+operator short()
+operator uchar()
+operator unsigned()
+operator ushort()
+operator() () : unsigned
+operator() (unsigned N) : unsigned
+operator==(const RNG& other)
+uniform(doubel a, double b) : double
+uniform(float a, float b) : float
+uniform(int a, int b) : int

RNG是random number generator的缩写,就是随机数生成器。RNG类聚合了unit64_t类,因为它有个public属性——state,是uint64类型的。RNG类中的方法可以用来制造随机scalar值以及给数组填充随机值。目前支持均匀分布和高斯分布(正态分布)。

构造函数

RNG有两个构造函数:

+state
unit64_t
cv::RNG
+unit64 state
+RNG()
+RNG(unit64 state)

两个构造函数的主要作用都是设置state属性的值。

无参构造函数

无参构造函数将state设置为预定值: 2 32 − 1 2^{32}-1 2321,即无符号整数(uint)的上限。

单参构造函数

这个构造函数需要输入一个unit64类型的参数,一般用8位的16进制数表示。
如果输入的参数为0,则调用无参构造函数,而不会使用0值生成随机数。

uniform方法

uniform方法有3个重载:

+state
unit64_t
cv::RNG
+unit64 state
+uniform(doubel a, double b) : double
+uniform(float a, float b) : float
+uniform(int a, int b) : int

每个版本的uniform函数都输入两个相同类型的参数,函数的返回类型也与输入的类型相同。
uniform接收double、float或int类型的两个参数a、b,并返回在[a, b)范围内的随机数。
uniform不关心你用什么类型的变量接收返回结果,而只关心你输入的参数的类型:如果两个参数都是int类型,则返回int;如果都是double,则返回double;如果都是float,则返回float。

RNG rng;

//只返回0
double a { rng.uniform(0,1) };

//返回[0, 1)之间的doulbe
double a1 { rng.uniform((double)0, (double)1) };

//返回[0, 1)之间的float
float b { rng.uniform(0.f, 1.f) };

//返回[0, 1)之间的double
double c { rng.uniform(0, , 1.) };

//可能会因为定义模糊而编译错误
//编译器会分不清:RNG::uniform(0, (int)0.999999)还是RNG::uniform((double)0, 0.999999)
double d { rng.uniform(0, 0.999999) };

实例1:产生随机颜色值

RNG rng{ 0xFFFFFFFFF };
static Scalar randomColor(RNG& rng){
	int icolor { static_cast<int>(rng) };	//通过指定类型,可以得到各种类型的随机数
	return Scalar(icolor&255,		//将随机数与255进行按位与运算,作为blue值
				(icolor>>8)&255,	//将随机数右移8位,然后与255进行按位与运算,作为green值
				(icolor>>16)&255);	//将随机数右移16位,然后与255进行按位与运算,作为red值
}

实例2:产生随机颜色、随机字体、随机线条的文字

int Displaying_Random_Text(Mat image, char* window_name, RNG rng)
{
	for(int i{1}; i < 100; i++){
		Point org;
		org.x = rng.uniform(-450, 1350);	//[-450, 1350)之间的随机整数作为点org的横坐标
		org.y = rng.uniform(-300, 900);		//[-300, 900)之间的随机整数作为点org的纵坐标
		
		putText(image,						//作图对象
				"Testing text rendering",	//文字内容
				org,						//文字坐标(左上角)
				rng.uniform(0,8),			//[0, 8)之间的随机整数作为字体索引
				rng.uniform(0,100)*0.05+0.1,//用[0, 100)之间的随机整数来换算成字体大小
				randomColor(rng),			//调用上一节中的函数产生随机颜色,作为字体颜色
				rng.uniform(1, 10),			//[1, 10)之间的随机整数作为线条粗细
				8);							//线条类型:连续线条
		imshow(window_name, image);
		if(waitKey(5)>=0){ return -1; }
	}
	return 0;
}

运行结果:
产生随机文字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值