简介

在测试算法的时候,或者某些算法需要使用随机数,本文介绍如何使用OpenCV的随机数相关功能。

主要内容:

1. cv::RNG类 —— random number generator

2. cv::randu —— 填充均匀分布随机数

3. cv::randn —— 填充高斯分布随机数


cv::RNG

RNG是OpenCV用来产生随机数的类,他可以产生标量随机数,也可以使用随机数填充Mat对象。当前它只支持均匀分布和高斯分布的随机数。

用实例展示如何产生标量随机数和填充Mat对象。

例1,产生标量随机数。

#include <iostream>
#include <opencv2/opencv.hpp>
int main(){
    cv::RNG rnger(cv::getTickCount());
    for (int i = 0; i < 10; i++){
        std::cout << "int    uniform  random number : " << rnger.uniform(0, 10) << std::endl;
        std::cout << "float  uniform  random number : " << rnger.uniform(0.f, 1.f) << std::endl;
        std::cout << "double uniform  random number : " << rnger.uniform(0., 1.) << std::endl;
        std::cout << "double gaussian random number : " << rnger.gaussian(1.) << std::endl;
        std::cout << std::endl;
    }
    return 0;
}

例2,用随机数填充矩阵

#include <iostream>
#include <opencv2/opencv.hpp>
int main(){
    cv::RNG rnger(cv::getTickCount());
    int width = 1280, height = 720;
    cv::Mat data;
    cv::Scalar mm, ss;
    // CV_8UC3 uniform distribution
    data.create(height, width, CV_8UC3);
    rnger.fill(data, cv::RNG::UNIFORM, cv::Scalar::all(0), cv::Scalar::all(256));
    cv::imshow("data", data);
    cv::waitKey();

    // CV_8UC1 uniform distribution
    data.create(height, width, CV_8UC1);
    rnger.fill(data, cv::RNG::UNIFORM, cv::Scalar::all(0), cv::Scalar::all(256));
    cv::imshow("data", data);
    cv::waitKey();

    // CV_32FC3 uniform distribution
    data.create(height, width, CV_32FC3);
    rnger.fill(data, cv::RNG::UNIFORM, cv::Scalar::all(0.), cv::Scalar::all(1.));
    cv::imshow("data", data);
    cv::waitKey();

    // CV_32FC1 uniform distribution
    data.create(height, width, CV_32FC1);
    rnger.fill(data, cv::RNG::UNIFORM, cv::Scalar::all(0.), cv::Scalar::all(1.));
    cv::imshow("data", data);
    cv::waitKey();

    // CV_32FC3 normal distribution
    data.create(height, width, CV_32FC3);
    rnger.fill(data, cv::RNG::NORMAL, cv::Scalar::all(0.), cv::Scalar::all(1.));
    cv::meanStdDev(data, mm, ss);
    std::cout << mm << ", " << ss << std::endl;

    // CV_32FC1 normal distribution
    data.create(height, width, CV_32FC1);
    rnger.fill(data, cv::RNG::NORMAL, cv::Scalar::all(0.), cv::Scalar::all(1.));
    cv::meanStdDev(data, mm, ss);
    std::cout << mm << ", " << ss << std::endl;

    return 0;
}

void RNG::fill(InputOutputArray mat, int distType, InputArray a, InputArray b, bool saturateRange=false );

mat :待填充的矩阵,他的内存必须已经分配!

distType :随机数的分布(cv::RNG::UNIFORM或者 cv::RNG::NORMAL)!

a :分布的第一个参数,如果distType=cv::RNG::UNIFORM,那a是均匀分布的下限。如果distType=cv::RNG::NORMAL 那么a 就是分布的均值。

b :分布的第二个参数,如果distType=cv::RNG::UNIFORM,那b 是均匀分布的上限(但不包括b)。如果distType=cv::RNG::NORMAL 那么b 就是分布的标准差。

randu,randn

randn和randu 可以用来替代 fill函数,唯一的区别是这两个函数使用默认的随机状态(state),而在使用fill的时候,我们用的是cv::getTickCount()来初始化随机状态的。

实例3,使用randu和randn

#include <iostream>
#include <opencv2/opencv.hpp>

int main(){
    int width = 1280, height = 720;
    cv::Mat data;
    cv::Scalar mm, ss;

    // CV_8UC3 uniform distribution
    data.create(height, width, CV_8UC3);
    cv::randu(data, cv::Scalar::all(0), cv::Scalar::all(256));
    cv::imshow("data", data);
    cv::waitKey();

    // CV_8UC1 uniform distribution
    data.create(height, width, CV_8UC1);
    cv::randu(data, cv::Scalar::all(0), cv::Scalar::all(256));
    cv::imshow("data", data);
    cv::waitKey();

    // CV_32FC3 uniform distribution
    data.create(height, width, CV_32FC3);
    cv::randu(data, cv::Scalar::all(0.), cv::Scalar::all(1.));
    cv::imshow("data", data);
    cv::waitKey();

    // CV_32FC1 uniform distribution
    data.create(height, width, CV_32FC1);
    cv::randu(data, cv::Scalar::all(0.), cv::Scalar::all(1.));
    cv::imshow("data", data);
    cv::waitKey();

    // CV_32FC3 normal distribution
    data.create(height, width, CV_32FC3);
    cv::randn(data, cv::Scalar::all(0.), cv::Scalar::all(1.));
    cv::meanStdDev(data, mm, ss);
    std::cout << mm << ", " << ss << std::endl;

    // CV_32FC1 normal distribution
    data.create(height, width, CV_32FC1);
    cv::randn(data, cv::Scalar::all(0.), cv::Scalar::all(1.));
    cv::meanStdDev(data, mm, ss);
    std::cout << mm << ", " << ss << std::endl;

    return 0;
}

OpenCV 2.x/3.x 随机初始化矩阵的更多相关文章

  1. [LeetCode] Random Flip Matrix 随机翻转矩阵

    You are given the number of rows n_rows and number of columns n_cols of a 2D binary matrix where all ...

  2. ML(5)——神经网络3(随机初始化与梯度检验)

    随机初始化 在线性回归和逻辑回归中,使用梯度下降法之前,将θ设置为0向量,有时会习惯性的将神经网络中的权重全部初始化为0,然而这在神经网络中并不适用. 以简单的三层神经网络为例,将全部权重都设置为0, ...

  3. Java实现 LeetCode 519 随机翻转矩阵

    519. 随机翻转矩阵 题中给出一个 n 行 n 列的二维矩阵 (n_rows,n_cols),且所有值被初始化为 0.要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位 ...

  4. TensorFlow中权重的随机初始化

    一开始没看懂stddev是什么参数,找了一下,在tensorflow/python/ops里有random_ops,其中是这么写的: def random_normal(shape, mean=0.0 ...

  5. [Swift]LeetCode519. 随机翻转矩阵 | Random Flip Matrix

    You are given the number of rows n_rows and number of columns n_cols of a 2D binary matrix where all ...

  6. OpenCV仿射变换+投射变换+单应性矩阵

    本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~ esti ...

  7. 吴恩达机器学习笔记47-K均值算法的优化目标、随机初始化与聚类数量的选择(Optimization Objective & Random Initialization & Choosing the Number of Clusters of K-Means Algorithm)

    一.K均值算法的优化目标 K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(又称畸变函数 Distortion function)为: 其中

  8. 阿基米德项目ALS矩阵分解算法应用案例

    转自:https://github.com/ceys/jdml/wiki/ALS 阿基米德项目ALS矩阵分解算法应用案例 编写人:ceys/youyis 最后更新时间:2014.5.12 一.算法描述 ...

  9. 矩阵补全(Matrix Completion)和缺失值预处理

    目录 1 常用的缺失值预处理方式 1.1 不处理 1.2 剔除 1.3 填充 2 利用矩阵分解补全缺失值 3 矩阵分解补全缺失值代码实现 4 通过矩阵分解补全矩阵的一些小问题 References 矩 ...

随机推荐

  1. SpringMVC(十二):SpringMVC 处理输出模型数据之@ModelAttribute

    Spring MVC提供了以下几种途径输出模型数据:1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据:2)Map及Model:处理方法入参 ...

  2. Hibernate(九):基于主键映射的1-1关联关系

    背景: 在实际开发中我们会遇到新建一个用户表,但这个表字段过长,而且有写字段常用(主要),有些字段比较不常用(次要).此时,我们会考虑到把用户信息拆分到两张表中:member(存储用户主要信息),me ...

  3. STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)

    1.原理: 通过定时器每隔一段时间触发一次DAC转换,然后通过DMA发送正玄波码表值给DAC. 当需要改变频率HZ时,只需要修改定时器频率即可(最高只能达到20KHz) 当需要改变正玄波的正峰峰值/负 ...

  4. CountDownLatch与thread-join()的区别

    今天学习CountDownLatch这个类,作用感觉和join很像,然后就百度了一下,看了他们之间的区别.所以在此记录一下. 首先来看一下join,在当前线程中,如果调用某个thread的join方法 ...

  5. MSSQL 复制数据 并随机打乱写入

    select * into temp from XX order by newid() -- 复制表结构 truncate table XX -- 清空表 SET IDENTITY_INSERT XX ...

  6. java中IO操作

    File类 /** * 路径分隔符:public static final String separator; * 设置文件路径:public File(String pathName) ; * 创建 ...

  7. 使用tkinter加载png,jpg

    最近来使用tkinter加载图片时遇到了困难,按照资料写了 photo = PhotoImage(file='ques.png') imglabel = Label(root, image=photo ...

  8. DDD实战进阶第一波(六):开发一般业务的大健康行业直销系统(实现产品上下文仓储与应用服务层)

    前一篇文章我们完成了产品上下文的领域层,我们已经有了关于产品方面的简单领域逻辑,我们接着来实现产品上下文关于仓储持久化与应用层的用例如何来协调 领域逻辑与仓储持久化. 首先大家需要明确的是,产品上下文 ...

  9. codevs 2964 公共素数因数

    提交地址:http://codevs.cn/problem/2964/ 2964 公共素数因数  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver 题解     ...

  10. [HNOI 2010]chorus 合唱队

    Description 题库链接 对于一个包含 \(N\) 个整数的数列 \(A\) ,我们可以把它的所有元素加入一个双头队列 \(B\) . 首先 \(A_1\) 作为队列的唯一元素,然后依次加入 ...