2013-09-26 8 views
6

Szukam najlepszego rozwiązania do generowania (w OpenCV) macierzy (2xN) liczb losowych o średniej 0 i wariancji 1, jak funkcja randn() w Matlab .OpenCV: RandN() Generator jak w Matlab

Jest randn() funkcji w bibliotekach OpenCV, ale nie wiem, w jaki sposób przekazywać argumenty do tej funkcji do generowania liczb ze średnią 0 i wariancji 1.

Odpowiedz

12

OpenCV ma randn() funkcji, a także RNG klasa. Poniżej znajduje się kod Matlaba, który chcesz zastąpić, oraz równoważny kod 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); 

lub

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); 

Wewnętrznie OpenCV realizuje randn() pomocą RNG. Wadą korzystania z randn() jest utrata kontroli nad materiałem siewnym.

Jeżeli powyższy matrix2xN ma więcej niż jeden kanał, to dla każdego kanału używana jest inna średnia/sigma. W takim przypadku musisz zwiększyć liczbę wierszy (lub col) w średniej i sigma, aby dopasować liczbę kanałów w matrix2xN.

+0

Dzięki za tę odpowiedź. +1. Jako sidenote, wydaje się, marnotrawstwo w projekcie interfejsu API, aby musiała określić 'cv :: Mat' tylko jednego elementu w celu określenia średniej lub odchylenia standardowego .... nie byłaby skalarem, lub' cv :: Skalar jest bardziej odpowiedni? Dziwne. – rayryeng