本文内容: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应为尺寸1×1,具有1个或4个通道的矩阵,或者尺寸为1×4的单通道矩阵,也可以是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将为尺寸为1×4的矩阵,或者为具有四个通道(类似于cv::Scalar类型),尺寸为1×1的矩阵。
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;
显示结果:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/46172.html