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对象
cv::RNG rng;  // 默认情况下随机数种子seed=-1,也可以指定随机数种子RNG rng(12345)
	      // rng既是一个RNG对象,也是一个随机整数
// 得到一个64位随机整数
int N1 = rng;
2、产生一个均匀分布的随机数
(1)产生一个[min_value, max_value)范围的均匀分布的整数
int randomInt = rng.uniform(min_value, max_value);
(2)产生一个[min_value, max_value)范围的均匀分布的浮点数
double randomDouble = rng.uniform(min_value, max_value);
示例:
//总是得到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、产生一个高斯分布(又叫正态分布)的随机数
// 产生一个均值为0,标准差为1的正态分布的随机数
double g = rng.gaussian(1.0);
// 产生一个均值为0,标准差为2的正态分布的随机数  
double N1g = rng.gaussian(2); 

4、获取下一个随机数

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

  • RNG:: next 返回下一个64位随机整数
  • RNG:: operator 返回下一个指定类型的随机数
示例:
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、实例演示
#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;
}

猜你喜欢

转载自blog.csdn.net/qq_33867131/article/details/132558314