2016-07-23 16 views
0

私は(x、y)のようなペアの値のデータセットを持っています。たとえば、xの範囲は-40〜60、yの範囲は0〜100です。最初はstd::vector<std::pair<float,float>>に格納されていますが、ループの中ではOpenCVのcv::calcHist関数に渡すために2チャネルcv::Matに変換します。私は1Dヒストグラムを達成したいと思います:here。私は実際に2つのデータ範囲を持っているので、結果的にはcv::Matからcv::calcHistまでの2Dヒストグラムで終わるのですが、基本的にy軸の値の平均値x軸のbin_size x_binに基づいて計算します。 (x、y):(-35,10)、(-39,20) 1D(10進数)は、ヒストグラムは、-40から-30までのビン範囲のy =(10 + 20)/ 2の平均を計算する必要があります。2次元データからOpenCV 1Dヒストグラムを生成する方法は?

したがって、各ビンの合計は、その特定のビンの範囲に入る値の単純なカウントではなく、むしろ値の平均であるべきです。

私は理解できる方法で問題を述べることができれば幸いです。どんな助けもありがとうございます。

答えて

1

OpenCVのcv::calcHistは、特にXに基づいてYの統計情報を取得しようとしているため、あなたが望むものが得られないと思います。とにかく、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]); 
    } 
    } 
} 
関連する問題