我有一個包含 1300 個資料的 std::vector 浮點數,即 {1.45890123, 1.47820920, 1.48326172, ...} 我想使用 std::map 構建向量的直方圖,然后用 OpenCV 繪制直方圖。這就是我使用 std::map 獲取每個資料的計數的方式,但我不知道如何進行分箱?
size_t frames = 1300
float_t *tdata = (float_t *)malloc(frames * sizeof(float_t));
std::vector<float_t> hdata(tdata, tdata frames);
std::vector<double> hdata_range, hdata_count;
std::map<float_t, int> hgram;
for (const auto &x : hdata) hgram[x];
transform(hgram.begin(), hgram.end(), back_inserter(hdata_range), [](const auto& val){return val.first;});
transform(hgram.begin(), hgram.end(), back_inserter(hdata_count), [](const auto& val){return val.second;});
然后我用 OpenCV 繪制直方圖,
Ptr<plot::Plot2d> plot_1b = plot::Plot2d::create(hdata_range, hdata_count);
plot_1b->setNeedPlotLine(true);
plot_1b->setShowText(false);
plot_1b->setShowGrid(false);
plot_1b->setPlotBackgroundColor(Scalar(255, 255, 255));
plot_1b->setPlotLineColor(Scalar(0, 0, 0));
plot_1b->setPlotLineWidth(5);
plot_1b->setInvertOrientation(true);
plot_1b->setPlotTextColor(Scalar(0, 0, 0));
plot_1b->render(cv_display_hdata);
出現一個包含直方圖的視窗,但由于我沒有分箱,因此每個資料的計數通常為 1。但我想在直方圖中添加分箱以生成高斯(正態)分布直方圖。
我怎么能用 std::map 做到這一點?
謝謝,羅利
使用稻田的解決方案,我能夠生成更好的直方圖,但最大計數與 Matlab 的不同,知道為什么嗎?

uj5u.com熱心網友回復:
如果要使用 astd::map對資料進行分箱,只需選擇 bin 的起始值作為鍵即可。為此,除以 bin 大小,然后計算下限。這將為您提供一個唯一標識垃圾箱的整數。
float_t binsize = 1.0f;
std::map<float_t, int> hgram;
for (auto x : hdata) {
hgram[std::floor(x / binsize)];
}
要將直方圖資料范圍調整為問題中使用的形式,只需按 bin 大小縮放鍵。您可以選擇要表示 bin 的任何單個值。它可能是 bin 的開始值或結束值。或者,在下面的示例中,我選擇垃圾箱的中心:
hdata_range.reserve(hgram.size());
hdata_count.reserve(hgram.size());
for (const auto& keyval : hgram)
{
hdata_range.push_back((keyval.first 0.5f) * binsize);
hdata_count.push_back(keyval.second);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/531071.html
標籤:C opencv向量
