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;
}
相关推荐
黑妹天下第一乖13 小时前
第 05 讲:阿加犀 AidCV 图像处理加速与 OpenCV 一致开发实战
开发语言·图像处理·人工智能·嵌入式硬件·数码相机·opencv·计算机视觉
企业数字化笔记2 天前
视频像素分割怎么选?HSV 阈值、传统掩膜、语义分割和实例分割的效果与代价
opencv·音视频
richard_yuu3 天前
OpenCV 实战第 2 篇:cv::Mat 内存模型,引用计数、ROI 与连续性
人工智能·opencv·计算机视觉
xailorliu4 天前
SLIC_超像素算法
c++·opencv·目标检测·机器学习·计算机视觉
企业数字化笔记5 天前
视觉智能体怎么选技术?目标检测、跟踪、分割、OpenCV和FFmpeg的职责划分
opencv·目标检测·ffmpeg
xailorliu6 天前
矩阵定性-正定负定不定半正定半负定
c++·opencv·线性代数·计算机视觉·矩阵
泡干脆面就番茄6 天前
MediaPipe人体感知全指南
opencv
欧特克_Glodon8 天前
OpenCV计算机视觉开发入门与实践(基于C++):专栏内容介绍及目录
c++·人工智能·opencv·计算机视觉
sali-tec8 天前
C# 基于OpenCv的视觉工作流-章110-YOLO 实例分割
图像处理·人工智能·opencv·算法·yolo·计算机视觉
爱写代码的小朋友8 天前
Windows 下 MSYS2 + MinGW64 安装与使用 OpenCV 全指南(含踩坑记录)
c++·人工智能·windows·opencv