简介

在测试算法的时候,或者某些算法需要使用随机数,本文介绍如何使用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

randnrandu 可以用来替代 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. SQL server2017的操作(练习题)

    题目: 假设有教材管理数据库BM,包括3个基本表: 教材(书号,书名,作者,出版社) B(Bno, Bname, Author, pub) 班级(班号,专业,所在系,人数) C(Cno, Spe, D ...

  2. c#获取网络时间并同步本地时间

    通过TCP形式来获取NTP时间.主要代码如下: [DllImport("kernel32.dll")] private static extern bool SetLocalTim ...

  3. Python系列之 - 描述符

    描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议 __get__():调用一个属性时,触 ...

  4. crypto必知必会

    crypto必知必会 最近参加了个ctf比赛,在i春秋,南邮方面刷了一些crypto密码学题目,从中也增长了不少知识,在此关于常见的密码学知识做个小总结! Base编码 Base编码中用的比较多的是b ...

  5. Angular CLI 安装

    安装Angular 官网的教程,因为国内网络环境原因,访问不了服务器,导致安装失败. 1.先安装NodeJs 安装教程:http://blog.csdn.net/zengmingen/article/ ...

  6. [LeetCode] Binary Number with Alternating Bits 有交替位的二进制数

    Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits will a ...

  7. python入门编程之三级菜单编程

    菜单实现功能输入一层显示下一层菜单不论在哪层输入b返回上一层不论在哪层输入q退出菜单此代码通过利用字典的知识可以实现_Author_ = 'jc'data = { '北京':{ '昌平':{ '沙河' ...

  8. linux 基本使用命令

    arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI ...

  9. [SDOI 2017]数字表格

    Description 题库链接 记 \(f_i\) 为 \(fibonacci\) 数列的第 \(i\) 项. 求 \[\prod_{i=1}^n\prod_{j=1}^mf_{gcd(i,j)}\ ...

  10. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...