1

根据最新的 OpenCV (OpenCV 2.4.5) 文档,cvGetHistValue_1D已从 imgproc 模块中弃用,现在是该legacy模块的一部分。

cvGetHistValue_1D如果我不打算使用该legacy模块,我想知道应该使用什么来代替。

我之前的代码如下,需要重写而不使用cvGetHistValue_1D

CvHistogram *hist = cvCreateHist(1, &numBins, CV_HIST_ARRAY, ranges, 1);
cvClearHist(hist);

cvCalcHist(&oDepth,hist);
cvNormalizeHist(hist, 1.0f);
float *cumHist = new float[numBins];
cumHist[0] = *cvGetHistValue_1D(hist, 0);
for(int i = 1; i<numBins; i++)
{
    cumHist[i] = cumHist[i-1] + *cvGetHistValue_1D(hist, i);

    if (cumHist[i] > 0.95)
    {
        oMaxDisp = i;
        break;
    }
}
4

1 回答 1

1

我假设您对使用 C++ API 感兴趣。矩阵元素访问很容易使用cv::Mat::at().

您的代码可能如下所示:

cv::Mat image;    //Already in memory
size_t oMaxDisp = 0;
cv::Mat hist;

//Setup the histogram parameters
const int channels = 0;
const int numBins = 256;
const float rangevals[2] = {0.f, 256.f};
const float* ranges = rangevals;

cv::calcHist(&image, 1, &channels, cv::noArray(), hist, 1, &numBins, &ranges);
cv::normalize(hist, hist,1,0,cv::NORM_L1);

float cumHist[numBins];
float sum = 0.f;
for (size_t i = 0; i < numBins; ++i)
{
    float val = hist.at<float>(i);
    sum += val;
    cumHist[i] = sum;

    if (cumHist[i] > 0.95)
    {
        oMaxDisp = i;
        break;
    }
}

作为旁注,new除非必要,否则最好不要使用。

于 2013-05-03T16:16:23.437 回答