RNG类概述
RNG
类定义在OpenCV的core
模块中。
RNG是random number generator的缩写,就是随机数生成器。RNG
类聚合了unit64_t
类,因为它有个public
属性——state
,是uint64
类型的。RNG
类中的方法可以用来制造随机scalar
值以及给数组填充随机值。目前支持均匀分布和高斯分布(正态分布)。
构造函数
RNG有两个构造函数:
两个构造函数的主要作用都是设置state
属性的值。
无参构造函数
无参构造函数将state设置为预定值: 2 32 − 1 2^{32}-1 232−1,即无符号整数(uint)的上限。
单参构造函数
这个构造函数需要输入一个unit64
类型的参数,一般用8位的16进制数表示。
如果输入的参数为0,则调用无参构造函数,而不会使用0值生成随机数。
uniform方法
uniform方法有3个重载:
每个版本的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;
}
运行结果: