简介

在测试算法的时候,或者某些算法需要使用随机数,本文介绍如何使用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. Hadoop 3.x 新特性剖析系列1

    1.概述 目前从Hadoop官网的Wiki来看,稳定版本已经发行到Hadoop2.9.0,最新版本为Hadoop3.1.0,查阅JIRA,社区已经着手迭代Hadoop3.2.0.那么,今天笔者就带着大 ...

  2. Windows使用Gitblit搭建Git服务器

    安装之前需确定安装JAVA运行环境. 下载安装 首先到 Gitblit官网 下载安装包.此处使用的版本是1.8.0. 将解压得到的gitblit-1.8.0文件夹放于C:\gitServer目录下. ...

  3. CentOS下实用的网络管理工具

    昨天在家把在家待业的笔记本装上了CentOS 7最小版本,今天拿到公司发现没法改Wifi链接,在解决的过程中发现了一个TUI工具非常好用,在此分享给大家. 1. 安装 sudo yum install ...

  4. Eclipse代码块折叠插件,安装使用

    在代码编写中经常会遇到一些很长的set(xxx)的代码,非常影响体验. 而Eclipse的folding插件可以自定义的将代码块进行折叠. 效果如下图所示: 可以根据代码块的功能来进行折叠,从而保证代 ...

  5. Docker入门之--定制镜像

    1. 首先定制一个Web 服务器为例 1.1 启动镜像 执行下面命令 docker run --name webserver -d -p 80:80 nginx 1.2 查看容器和镜像状态 然后执行下 ...

  6. ●POJ 1509 Glass Beads

    题链: http://poj.org/problem?id=1509 题解: 给出一个字符串,有一个操作:把首字符放到末尾,形成新的串.求任意次操作后,字典序最小的串的首字母在原串中的位置.(这就是最 ...

  7. 2015 多校联赛 ——HDU5384(AC自动机)

    Sample Input 1 5 6 orz sto kirigiri danganronpa ooooo o kyouko dangan ronpa ooooo ooooo   Sample Out ...

  8. 在QEMU中调试ARM程序【转】

    转自:http://linuxeden.com/html/develop/20100820/104409.html 最近我想调试一个运行在QEMU模拟ARM系统中的Linux程序.我碰到过一些麻烦,因 ...

  9. IP地址、子网掩码、网关、DNS服务器

    1. IP地址 IP是英文Internet Protocol的缩写,意思是"网络之间互连的协议",也就是为计算机网络相互连接进行通信而设计的协议.在因特网中,它是能使连接到网上的所 ...

  10. Python3中无法导入ssl模块的解决办法

    这个问题,已经困扰我好几天了,本萌新刚开始接触python,想爬取几个网页试试,发现urllib无法识别https,百度后才知道要导入ssl模块,可是发现又报错了. 本人实在无法理解为什么会报错,因为 ...