2016-07-23 38 views
0

我有一個配對值的數據集,如(x,y)。例如:x的範圍從-40到60,y從0到100.最初它們存儲在std::vector<std::pair<float,float>>中,但在一個循環中我將它們轉換爲2通道cv::Mat,以便能夠將它傳遞給OpenCV的cv::calcHist函數。我想要達到這樣的一維直方圖:here。由於我實際上有兩個數據範圍,因此我總是以cv::calcHist作爲cv::Mat的結果得到一個二維直方圖,但我基本上想要根據給定的bin_size x_bin計算x軸中y值的平均值。作爲示例:x的範圍從-40到60,期望的bin = 10,bin_size = 10,數據點(x,y):(-35,10),( - 39,20) 1D那麼直方圖將需要計算從-40到-30的料倉範圍的y =(10 + 20)/ 2的平均值。如何從2D數據生成OpenCV 1D直方圖?

因此,每個垃圾桶的總和不應該是落在該垃圾桶範圍內的值的簡單計數,而應該是值的平均值。

我希望我能以可理解的方式陳述問題。任何幫助表示讚賞。

回答

1

我不認爲OpenCV的cv::calcHist能夠給你你想要的東西,尤其是因爲你試圖在Y上獲得基於X的統計信息。無論如何,沒有OpenCV就不難做到。

void calcHist(const std::vector<std::pair<float, float>>& data, const float min_x, const float max_x, const int num_bins, std::vector<float>& hist) 
{ 
    hist.resize(num_bins, 0.f); 
    std::vector<int> hist_counts(num_bins, 0); 
    float bin_size = (max_x-min_x)/num_bins; 
    for (const auto& p : data) { 
    // Assign bin 
    int bin = static_cast<int>((p.first-min_x)/bin_size); 
    // Avoid out of range 
    bin = std::min(std::max(bin, 0), num_bins-1); 
    hist[bin] += p.second; 
    hist_counts[bin]++; 
    } 
    // Compute average 
    for (int i = 0;i < num_bins; ++i) { 
    if (hist_counts[i]) { 
     hist[i] /= static_cast<float>(hist_counts[i]); 
    } 
    } 
}