2013-09-26 35 views
6

Tôi đang tìm giải pháp tốt nhất để tạo (trong OpenCV) một ma trận (2xN) các số ngẫu nhiên có nghĩa là 0 và phương sai 1, như hàm randn() trong Matlab .Máy phát OpenCV: randn() giống như trong MATLAB

Có một chức năng randn() trong các thư viện OpenCV, nhưng tôi không biết làm thế nào để vượt qua đối số cho hàm này để tạo ra các số với trung bình 0 và phương sai 1.

Trả lời

12

OpenCV có chức năng randn() và cũng là một RNG lớp học. Dưới đây là mã Matlab bạn có thể muốn thay thế và mã OpenCV tương đương.

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

hoặc

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

Bên trong, OpenCV thực hiện randn() sử dụng RNG. Những bất lợi nếu sử dụng randn() là bạn mất quyền kiểm soát hạt giống.

Nếu matrix2xN ở trên có nhiều kênh thì giá trị trung bình/sigma khác nhau được sử dụng cho mỗi kênh. Trong trường hợp đó, bạn sẽ cần phải bôi trơn số hàng (hoặc cols) trong trung bình và sigma để phù hợp với số kênh trong matrix2xN.

+0

Cảm ơn câu trả lời này. +1. Là một sidenote, có vẻ như lãng phí trong thiết kế API phải chỉ định một 'cv :: Mat' của chỉ một phần tử để xác định độ lệch trung bình hoặc chuẩn .... sẽ không phải là vô hướng, hoặc' cv :: Scalar' có phù hợp hơn không? Kỳ dị. – rayryeng

Các vấn đề liên quan