2016-07-23 7 views
0

저는 (x, y)와 같은 쌍 값의 데이터 세트를 가지고 있습니다. 예를 들어, x 범위는 -40에서 60 사이이며 0에서 100까지입니다. 처음에는이 코드를 std::vector<std::pair<float,float>>에 저장했지만 루프에서는 OpenCV의 cv::calcHist 함수에 전달할 수 있도록 cv::Mat 채널로 변환합니다. 다음과 같이 1D 히스토그램을 얻고 싶습니다. here. 실제로 두 개의 데이터 범위가 있기 때문에 결과적으로 2D 히스토그램이 cv::calcHist에서 cv::Mat으로 끝나지 만 기본적으로 지정된 bin_size를 기준으로 계산합니다. x_bin x 축은 y 값의 평균을 나타냅니다. (x, y) : (-35, 10), (-39, 20) 1D (예를 들어, 히스토그램은 bin 범위가 -40에서 -30 인 경우 y = (10 + 20)/2의 평균을 계산해야합니다.2D 데이터에서 OpenCV 1D 히스토그램을 생성하는 방법은 무엇입니까?

따라서 각 bin의 합계는 해당 bin 범위에 속하는 단순한 값의 수가 아니라 값의 평균입니다.

내가 이해할 수있는 방법으로 문제를 진술 할 수 있기를 바랍니다. 어떤 도움을 주셔서 감사합니다.

답변

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]); 
    } 
    } 
} 
관련 문제