OpenCV 2.x/3.x 随机初始化矩阵
来源:互联网 发布:网络培训机构 编辑:程序博客网 时间:2024/03/29 18:38
简介
在测试算法的时候,或者某些算法需要使用随机数,本文介绍如何使用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 随机初始化矩阵
- OpenCV 2.X 和 OpenCV 3.X的区别是什么?
- OpenCV 1.x & 2.x 编程简介(矩阵/图像/视频的基本读写操作)
- OpenCV 3.x版本
- Opencv 2.x和3.x库的不同
- windows下 OpenCV 2.x.x Python 2.7.x配置
- VS2010配置Opencv 2.x
- OpenCV 2.x + SVM介绍
- cocos2d-x 随机函数
- opencv x.x 编译源码
- 日记:opencv python借口函数2.X版本和3.X版本变化
- note2.Webx 2.x初始化之webxLoader
- spark2.x---2. SparkContext构成与初始化
- centos6.x初始化脚本
- vue2.x的初始化
- OpenCV 3.x Lib 源码结构简介
- Python 3.x 安装opencv+opencv_contrib
- OpenCV 2.x + SVM线性不可分处理
- HDOJ 2052 Picture
- sga pga uga分配情况分析
- [poj 1019] Number Sequence 数学 想法题
- 232. Implement Queue using Stacks
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
- OpenCV 2.x/3.x 随机初始化矩阵
- String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
- 防止打包的时候删除SDK需要的so库
- iOS开发-环信UI集成
- 五个最佳案例带你解读Node.js的前后之道
- 新装LINUX系统如何获得ROOT权限
- Android自定义spinner下拉框实现的实现
- DB2正则表达式
- 程序员为何找不到女票的原因