2017-04-07 68 views
1

我想與在均勻分佈,但是具有不同的範圍爲每列和這裏的隨機數來填充的OpenCV(V3.2)一個10000x2矩陣是與所述問題以下代碼:填補與diffierent均勻分佈的隨機數的多功能使用立體的矩陣範圍

Mat centers(10000, 2, CV_32F); 
RNG rng(time(NULL)); 
rng.fill(centers, RNG::UNIFORM, Scalar(0, 0), Scalar(10, 1000)); 

我期望的第一列是隨機填充值零和10和第二柱之間的零和1000但兩者列零和之間填充有值之間要填充值10, 所以我決定以下面的形式實現它。

Mat centers(10000, 2, CV_32F); 
RNG rng(time(NULL)); 
rng.fill(centers.colRange(0, 1), RNG::UNIFORM, 0, 10); 
rng.fill(centers.colRange(1, 2), RNG::UNIFORM, 0, 1000); 

但它也不起作用。我認爲是因爲RNG :: fill不支持非連續矩陣(在文檔中沒有提到) 所以剩下的唯一方法是使用循環,這是浪費時間和性能。上午我做某事錯以上或者我應該放棄,並使用一個for循環

回答

0

只是我犯了一個錯誤使用多範圍分配參數的RNG :: fill api。應該使用多通道而不是多列矩陣,儘管它們共享相同的底層數據結構。所以,Mat centers(10000, 2, CV_32F);應該是Mat centers(10000, 1, CV_32FC2);

0

你誤解了API的RNG::fill()documentation,其中明確規定了參數a和b爲:

一個 - 第一分佈參數;在均勻分佈的情況下,這是一個包含邊界的下限。

b - 第二分佈參數; 在均勻分佈的情況下,這是一個非包含上邊界 。

所以有,你可以在ab通過多個範圍的文件中沒有提及。因此,解決方案是創建兩個尺寸爲1000 x 1Mat,對它們兩者使用不同的值ab,然後將它們連接在一起以創建尺寸爲1000 x 2的統一墊子。

cv::RNG rng = cv::RNG(0xFFFFFFFF); 
cv::Mat centers(10000, 1, CV_32F); 
cv::Mat centers2(10000, 1, CV_32F); 
rng.fill(centers, cv::RNG::UNIFORM, cv::Scalar(0), cv::Scalar(10)); 
rng.fill(centers2, cv::RNG::UNIFORM, cv::Scalar(0), cv::Scalar(1000)); 

cv::Mat final; 
cv::hconcat(centers, centers2, final); 
+0

謝謝你的作品,但是在文檔「在多通道圖像的情況下,每個通道都是獨立填充的」這個短語的全部內容是隻有正常的dist?以及如果我們只允許用統一的相同範圍值填充整個矩陣,標量的用法是什麼 – AMCoded