一个随机数对象(RNG)用来产生随机数的伪随机序列。这样做的好处是你可以方便地得到多重伪随机数流。一旦随机数发生器创建,就会开始按需提供产生随机数的“服务”,无论是平均分布还是正态分布。

RNG& theRNG(void);

theRNG()函数为调用它的线程返回一个默认的随机数生成器。OpenCV自动为每一个执行中的线程创建一个cv::RNG的实例,因此再多线程中非常安全。如果你只想要一个数或者只初始化一个数组,用cv::randu()或者cv::randn()。

void setRNGSeed(int seed);//设置随机数序列的种子

cv::RNG::operator T()

下面是重载的类型转换操作符,可以将RNG对象转换成任何你想要的类型。

operator uchar();
/** @overload */
operator schar();
/** @overload */
operator ushort();
/** @overload */
operator short();
/** @overload */
operator unsigned();
/** @overload */
operator int();
/** @overload */
operator float();
/** @overload */
operator double();

产生整型数的时候,它们将覆盖整个可能的取值范围。当产生浮点数的时候,它的范围始终是{0.0,1.0]。

RNG rng = theRNG();
cout << "An integer: " << int(rng) << endl;
cout << "An float: " << float(rng) << endl;

cv::RNG::operator()

unsigned operator ()();//返回随机值在0-UINT_MAX之间
unsigned operator ()(unsigned N);//返回值在0-(N-1)之间

cv::RNG::uniform()

int uniform(int a, int b);
float uniform(float a, float b);
double uniform(double a, double b);

函数在[a,b)的范围内产生平均分布的随机数。

float x = rng.uniform(0, 1);

注意,上面这个情况只能得到0.f,因为0和1是整型数,在[0,1)范围内只有0,要想得到浮点数,应使用

float x = rng.uniform(0.f, 1.f);

主要是在YOLOv5的部署中,不同类别用不同的颜色,当类别很多时,随机产生num_classes个颜色比较方便.

    RNG rng = theRNG();
vector<Scalar> colors;
for (int i = 0; i < 80; i++){
int b = rng.uniform(0, 255);
int g = rng.uniform(0, 255);
int r = rng.uniform(0, 255);
colors.push_back(Scalar(b, g, r));

cv::RNG::gaussian()

double gaussian(double sigma);
void fill( InputOutputArray mat, //输入数组,值会被覆盖
      int distType, //分布的类型(gaussian or uniform)
      InputArray a, //min(uniform) or mean(Gaussian)
      InputArray b,   //max(uniform) or std-deviation(Guassian)
      bool saturateRange = false
);

InputOutputArray 输入输出矩阵,最多支持4通道,超过4通道先用reshape()改变结构。

int distType UNIFORM 或 NORMAL,表示均匀分布和高斯分布。

InputArray a disType是UNIFORM,a表示为下界(闭区间);disType是NORMAL,a均值。

InputArray b disType是UNIFORM,b表示为上界(开区间);disType是NORMAL,b标准差。

bool saturateRange=false 只针对均匀分布有效。当为真的时候,会先把产生随机数的范围变换到数据类型的范围,再产生随机数。如果为假,会先产生随机数,再进行截断到数据类型的有效区间

RNG rng = theRNG();
double a = rng.gaussian(2.0);
cout << a << endl; Mat b(1, 10, CV_8UC1);
rng.fill(b, RNG::UNIFORM, 1, 10);
cout << b << endl;

Opencv笔记(11)随机数发生器cv::RNG的更多相关文章

  1. C++11随机数发生器

    前言 一直知道所谓的"随机数"都是伪随机,事实上也是满足某种规则生成的.有些程序测试时通常需要一个随机数源,但在新标准出现之前,C++都是依赖简单的C库函数rand来生成随机数的. ...

  2. 图像储存容器Mat[OpenCV 笔记11]

    IplImage 与 Mat IplImage是OpenCV1中的图像存储结构体,基于C接口创建.在退出之前必须release,否则就会造成内存泄露.在一些只能使用C语言的嵌入式系统中,不得不使用. ...

  3. C语言基础(11)-随机数发生器

    一. rand() rand是一个C语言库函数,功能是生成一个随机数.rand需要一个不同的种子,才能生成不同的随机数. 二. srand(int seed) rand需要一个不同的种子,才能生成不同 ...

  4. 玩转X-CTR100 l STM32F4 l RNG硬件随机数发生器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 STM32F4硬件随 ...

  5. 查找并绘制轮廓[OpenCV 笔记XX]

    好久没有更新了,原谅自己放了个假最近又在赶进度,所以...更新的内容是很靠后的第八章,因为最近工作要用就先跳了,后面会更新笔记编号...加油加油! 在二值图像中寻找轮廓 void cv::findCo ...

  6. opencv笔记6:角点检测

    time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...

  7. opencv笔记1:opencv的基本模块,以及环境搭建

    opencv笔记1:opencv的基本模块,以及环境搭建 安装系统 使用fedora22-workstation-x86_64 安装opencv sudo dnf install opencv-dev ...

  8. Core模块其他常用知识点[OpenCV 笔记14]

    Matx 轻量级的Mat,必须在使用前规定好大小,比如一个2x3的float型的Matx,可以声明为Matx23f Vec Vec是Matx的一个派生类,是一个一维的Matx,跟vector很相似.在 ...

  9. OpenCV笔记大集锦(转载)

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

  10. opencv笔记4:模板运算和常见滤波操作

    time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...

随机推荐

  1. c# 前台和后台线程

    前台和后台线程 Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程.这两者的区别就是:应用程序必须运行完所有的前台线程才可以退 ...

  2. 重新整理数据结构与算法(c#系列)—— 树的前中后序遍历查找[十七]

    前言 树的前中后序遍历 是根据前中后序的顺序来查找,找到了则弹出. 正文 节点模型: public class HeroNode { private int no; private string na ...

  3. 基于locust全链路压测系统

    2021年中旬就计划着搭建一套压测系统,大约9月份已经搭建完成,使用至今还是比较稳定了,分享一下搭建思路及过程: 为什么选择Locust呢,因为Locust可以仅需要执行命令就可以完成压测任务,并且集 ...

  4. vue2.0中watch用法

    watch:观测Vue实例上的数据变动,对应一个对象,键:就是需要监测的那个东西,值:1.可以是当键变化时执行的函数,有两个参数,第一个是变化前的值,第二个是变化后的值.2.可以是函数名,得用单引号包 ...

  5. 牛客网-SQL专项训练7

    ①SQL语言可以分为多个类别,那么不属于数据操纵语言DML的是(B) 解析: SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语 ...

  6. Spring Cloud Gateway一次请求调用源码解析

    简介: 最近通过深入学习Spring Cloud Gateway发现这个框架的架构设计非常简单.有效,很多组件的设计都非常值得学习,本文就Spring Cloud Gateway做一个简单的介绍,以及 ...

  7. C#类型后加问号?

    C# 可空类型(Nullable)说明_w3cschool 细说Nullable<T>类型 - Sweet-Tang - 博客园 (cnblogs.com) 值类型变量不能null,加问号 ...

  8. ESP32 多线程入门实验

    一.线程创建函数 函数 void xTaskCreate ( pdTASK_CODE pvTaskCode, const portCHAR * const pcNane, unsigned portS ...

  9. 001_Cadence软件的安装与介绍

    001_Cadence软件的安装与介绍 软件版本16.6,软件下载:搜索PCB联盟; 安装步骤: 1)   把5个分卷的压缩包解压到同一文件夹; 2)   双击Setup.exe开始安装,先安装Lic ...

  10. 通过虚拟机镜像部署zabbix

    前言 由于基础镜像的缘故,zabbix部署过程中很可能出现各种缺少依赖包的情况,如果环境中又无法连接互联网,系统部署会非常麻烦.为此zabbix官方提供了虚拟机镜像,导入后可以直接在平台上拉起虚拟机, ...