19_OpenCV随机数

本文内容:OpenCV中与随机数有关的函数:cv::randu()、cv::randn()、cv::randShuffle()。

1. cv::randu()

函数原型:

template<typename _Tp> _Tp randu();  // return random number of specific type
cv::randu(
	cv::InputOutputArray mtx,  // all values will be eandomized
	cv::InputArray low,  // minmum,1-by-1 (Nc=1,4) or 1-by-4(Nc=1)
	cv::InputArray high,  // maxmum,1-by-1 (Nc=1,4) or 1-by-4(Nc=1)
);

计算:

函数说明:从函数声明可以看出来有两种方式调用cv::randu()。一种是模板形式,另一种是提供希望填充数据的矩阵及两个附加矩阵。

第一种方法将返回适当类型的随机值,以这种方式生成的随机数是均匀分布的。对于整数,产生从0到该类型的最大值范围内的数;对于浮点类型,产生0.0到1.0(不包括1.0)之间的数,此模板形式仅生成单个数字。

第二种方法指定生成的随机矩阵的最小值和最大值。附加的low和high应为尺寸1x1,具有1个或4个通道的矩阵,或者尺寸为1x4的单通道矩阵,也可以是cv::Scalar类型。在任何情况下,low和high都不是mtx的尺寸,而是mtx单个条目的尺寸。

mtx既是输入矩阵也是输出矩阵,所以需要为mtx分配内存,以使cv::randu()直到需要随机值的数量以及它们在行、列以及通道上如何排列。

2. cv::randn()

函数原型:

void cv::randn(
	cv::InputOutputArray mtx,  // all values will be randomized
	cv::InputArray mean,  // mean values, array is in channel space
	cv::InputArray stddev  // standard deviations channel space
);

计算公式:

函数说明:函数cv::randn()使用随机正态分布的值填充矩阵mtx。这些值的生成参数来自两个附加的矩阵,它们指定分布均值和标准差,从而为每个特定的矩阵元素生成随机数。
与cv::randu()的矩阵形式一样,mtx的每个元素都是单独计算的,矩阵mean和stddev在各个通道中对mtx的每个元素进行取值,因此,如果mtx是四通道矩阵,则mean和stddev将为尺寸为1x4的矩阵,或者为具有四个通道(类似于cv::Scalar类型),尺寸为1x1的矩阵。

3. cv::randShuffle()

函数原型:

void cv::randShuffle(
	cv::InputOutputArray mtx,  // all values will be shuffled
	double iterFactor = 1,  // number of times to repeat shuffle
	cv::RNG* rng = NULL  // your own generator,if you like
);

函数说明:cv::randShuffle()函数尝试通过选中随机元素对和交换其位置来随机化一维矩阵中的元素。交换的数量等于矩阵mtx的尺寸乘以可选因子iterFactor。可选的是,可以提供随机数生成器。如果没有提供,则自动使用默认的随机数生成器theRNG()。

使用示例:

	// cv::randu()/cv::randn()/cv::randShuffle()函数连续运行生成的随机数是一样的
	for (int i = 0; i < 10; i++){  
		std::cout << cv::randu<uint16_t>() << std::endl;
	}
	
	cv::Mat random_randu(4, 5, CV_16UC1);
	cv::Mat random_randn(4, 5, CV_16UC1);
	cv::Mat random_randShuffle(4, 5, CV_16UC1);

	cv::randu(random_randu, cv::Scalar(0), cv::Scalar(1023));
	std::cout << "random = \n " << random_randu << std::endl;

	cv::randn(random_randn, cv::Scalar(44.5), cv::Scalar(34.23));
	std::cout << "random = \n " << random_randn << std::endl;

	cv::randShuffle(random_randShuffle, 10);
	std::cout << "random = \n " << random_randShuffle << std::endl;

显示结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值