【发布时间】:2013-09-26 19:38:31
【问题描述】:
我正在寻找生成(在 OpenCV 中)均值为 0 方差为 1 的随机数矩阵 (2xN) 的最佳解决方案,例如 Matlab 中的函数 randn()。
OpenCV 库中有一个randn() 函数,但我不知道如何将参数传递给该函数以生成均值为 0 和方差为 1 的数字。
【问题讨论】:
我正在寻找生成(在 OpenCV 中)均值为 0 方差为 1 的随机数矩阵 (2xN) 的最佳解决方案,例如 Matlab 中的函数 randn()。
OpenCV 库中有一个randn() 函数,但我不知道如何将参数传递给该函数以生成均值为 0 和方差为 1 的数字。
【问题讨论】:
OpenCV 有一个randn() 函数和一个RNG 类。下面是您可能想要替换的 Matlab 代码,以及等效的 OpenCV 代码。
Matlab:
matrix2xN = randn(2,N)
OpenCV:
cv::Mat mean = cv::Mat::zeros(1,1,CV_64FC1);
cv::Mat sigma= cv::Mat::ones(1,1,CV_64FC1);
cv::RNG rng(optional_seed);
cv::Mat matrix2xN(2,N,CV_64FC1);
rng.fill(matrix2xN, cv::RNG::NORMAL, mean, sigma);
或
cv::Mat mean = cv::Mat::zeros(1,1,CV_64FC1);
cv::Mat sigma= cv::Mat::ones(1,1,CV_64FC1);
cv::randn(matrix2xN, mean, sigma);
在内部,OpenCV 使用RNG 实现randn()。使用randn() 的缺点是您无法控制种子。
如果上面的matrix2xN 有多个通道,则每个通道使用不同的平均值/西格玛。在这种情况下,您需要增加 mean 和 sigma 中的行数(或 cols)以匹配 matrix2xN 中的通道数。
【讨论】:
cv::Mat 以指定均值或标准偏差似乎很浪费......不是标量或cv::Scalar 更合适?很奇怪。