【OpenCV】用RNG生成随机数的小例子

本文介绍了如何利用OpenCV的RNG类生成随机数,包括设置种子、获取随机数、填充矩阵等方法,并提供了一个每50ms在图片上绘制随机线段的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cv::RNG::RNG()

cv::RNG::RNG(unit64 state)

类似于C中的srand(),要先给它一个种子,srand()用的是unsigned int的32位种子,而RNG()用的是64位长整数种子。

常用的方法有:

next:取出下一个随机数

uniform:返回指定范围的随机数

gaussian:返回一个高斯随机数

fill:用随机数填充矩阵

int uniform(int a, int b);
 
float uniform(float a, float b); 
 
double uniform(double a, double b); 

void fill( InputOutputArray mat, int distType, InputArray a, InputArray b, bool saturateRange=false );

double gaussian(double sigma);

unsigned next();

一个小栗子:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include <time.h>
using namespace cv;
using namespace std;

Mat testimage = imread("H:\\opencv\\sources\\samples\\java\\clojur
<think>嗯,用户想了解OpenCV中的RNG函数的功能和用法。首先,我需要回忆一下RNGOpenCV中的作用。RNG应该是随机数生成器,用于生成各种随机数,比如整数、浮点数,或者填充矩阵。那它的主要功能应该包括生成均匀分布和正态分布的随机数,可能还有设置种子之类的操作。 接下来,用户可能需要具体的例子,比如如何初始化RNG对象,生成不同类型的随机数,以及实际应用场景。比如在图像处理中,生成噪声或者随机颜色都会用到RNG。记得要检查引用的资料是否符合,用户提供的引用里提到了Mat类,线程安全,引用计数这些,可能和RNG的使用场景相关,比如多线程中使用RNG是否安全? 然后,我需要确认RNG的成员函数,比如uniform、gaussian、fill等。这些函数的具体参数和用法可能需要详细说明。比如,uniform函数生成指定范围的随机数,gaussian生成符合正态分布的数,fill用随机数填充矩阵。 还要注意用户提到的官方文档和示例代码,需要确保给出的代码是正确的,符合C++的语法,并且注释清晰。例如,初始化RNG对象时,可以使用默认构造函数或者指定种子,生成随机整数、浮点数,填充矩阵,以及生成高斯噪声等。 另外,用户的问题可能涉及RNG的线程安全性。根据引用[1],OpenCV的实现是可重入的,可以在不同线程使用不同的实例,但同一个RNG实例在多线程中可能需要加锁。这点需要提到,避免用户在多线程环境下出错。 最后,生成的相关问题需要考虑用户可能进一步想知道的内容,比如种子设置的影响,与其他随机数库的区别,性能优化,或者实际应用案例。这些问题可以帮助用户更深入地理解RNG的使用。</think>### OpenCVRNG函数的功能与用法 #### 一、功能说明 OpenCV中的`cv::RNG`类是用于生成随机数的工具,支持均匀分布、正态分布等随机数生成,常用于数据增强、噪声模拟、算法初始化等场景。其核心功能包括: 1. **生成均匀分布的整数或浮点数**:例如在指定区间$[a, b)$内生成随机数[^1]。 2. **生成正态分布的随机数**:通过高斯分布参数$(\mu, \sigma)$生成随机值。 3. **填充矩阵**:快速生成随机数填充`cv::Mat`对象,适用于生成测试数据或噪声[^2]。 4. **可重复性**:通过设定种子值,可复现随机序列,便于调试[^3]。 #### 二、基本用法 ##### 1. 初始化RNG对象 ```cpp #include <opencv2/opencv.hpp> // 默认构造函数(基于时间戳种子) cv::RNG rng; // 指定种子值(保证随机序列可复现) cv::RNG rng_fixed(12345); ``` ##### 2. 生成随机数 ```cpp // 生成[0, 100)的整数 int rand_int = rng.uniform(0, 100); // 生成[0.0, 1.0)的浮点数 double rand_double = rng.uniform(0.0, 1.0); // 生成均值为0、标准差为1的高斯分布数 double gaussian = rng.gaussian(1.0); ``` ##### 3. 填充矩阵 ```cpp // 创建3x3矩阵,填充[0, 255)的整数 cv::Mat mat(3, 3, CV_8UC1); rng.fill(mat, cv::RNG::UNIFORM, 0, 256); ``` #### 三、应用示例 ##### 为图像添加高斯噪声 ```cpp cv::Mat addGaussianNoise(const cv::Mat& src, double sigma) { cv::Mat noise(src.size(), src.type()); cv::RNG rng; rng.fill(noise, cv::RNG::NORMAL, 0, sigma); return src + noise; } ``` #### 四、注意事项 1. **线程安全**:每个线程应使用独立的`RNG`实例(OpenCV的线程安全设计允许跨线程使用不同实例)[^1]。 2. **性能优化**:批量生成数据时优先使用`fill()`而非多次调用`uniform()`。 3. **种子管理**:调试时固定种子,生产环境使用动态种子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值