简介

在测试算法的时候,或者某些算法需要使用随机数,本文介绍如何使用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. 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理

    05.NetCore2.0依赖注入(DI)之Web应用启动流程管理 在一个Asp.net core 2.0 Web应用程序中,启动过程都做了些什么?NetCore2.0的依赖注入(DI)框架是如何管理 ...

  2. python九九乘法表

    j = 1 while j <= 9: i = 1 while i <= j: print("%d*%d=%d\t" % (i, j, i*j), end=" ...

  3. [LeetCode] Longest Continuous Increasing Subsequence 最长连续递增序列

    Given an unsorted array of integers, find the length of longest continuous increasing subsequence. E ...

  4. [AHOI 2016初中组]迷宫

    Description 小雪和小可可被困在了一个无限大的迷宫中. 已经知道这个迷宫有 N 堵环状的墙,如果把整个迷宫看作是一个二维平面,那么每一堵墙都是平面上一个圆.任意两个圆不相交,不重合,也不会相 ...

  5. [WC 2011]Xor

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  6. clique

    [题目描述]数轴上有 n 个点,第 i 个点的坐标为 xi,权值为 wi.两个点 i,j 之间存在一条边当且仅当 abs(xi-xj)>=wi+wj.你需要求出这张图的最大团的点数.(团就是两两 ...

  7. bzoj 5289: [Hnoi2018]排列

    Description Solution 首先注意到实际上约束关系构成了一棵树 考虑这个排列 \(p\),编号为 \(a[i]\) 的出现了,\(i\) 才可以出现 那么如果连边 \((a[i],i) ...

  8. HDU - 3037:Saving Beans

    #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...

  9. ●CodeForces 549F Yura and Developers

    题链: http://codeforces.com/problemset/problem/549/F题解: 分治,链表. 考虑对于一个区间[L,R],其最大值在p位置, 那么答案的贡献就可以分为3部分 ...

  10. STL注意比较函数

    可重复插入?: set<int ,less_equal<int> >s; s.insert(10); s.insert(10); 第二次调用insert,集合回去确认10是否已 ...