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;
}
相关推荐
小保CPP16 小时前
OpenCV C++基于CNN模型的场景文本检测(OCR)
c++·人工智能·opencv·计算机视觉·cnn·ocr·光学字符识别
sali-tec16 小时前
C# 基于OpenCv的视觉工作流-章99-换背景
图像处理·人工智能·opencv·算法·计算机视觉
sali-tec3 天前
C# 基于OpenCv的视觉工作流-章98-频域滤波
图像处理·人工智能·opencv·计算机视觉
落苜蓿蓝3 天前
多张覆盖视场的平面棋盘图片; 、对每张图片用 OpenCV 的 findChessboardCorners 检测内角点并用 corn ...
数码相机·opencv·平面
明如正午3 天前
【python】Python + OpenCV 实现视频关键帧提取与智能去重
python·opencv·音视频
azoo3 天前
SimpleBlobDetector的使用
opencv
映翰通网络3 天前
TI开发板上的边缘AI工具链:先认清OpenCV、GStreamer和TIDL
人工智能·嵌入式硬件·opencv·计算机视觉·ti
小保CPP4 天前
OpenCV C++形态学操作-腐蚀与膨胀
c++·人工智能·opencv·计算机视觉
m沐沐4 天前
【深度学习】模型部署全解析——从原理到Flask服务端实战
人工智能·后端·python·深度学习·opencv·flask
阿_旭4 天前
【分割实战】三种图像分割方法实战对比:Mask R-CNN + GrabCut + OpenCV【附源码】
opencv·图像分割