opencv calcHist error - PullRequest
       16

opencv calcHist error

1 голос
/ 22 июля 2011

Я получаю ошибку неоднозначности в OpenCV, когда пытаюсь вычислить гистограмму и мне было интересно, что я что-то упустил. Я посмотрел на параметры функции и увидел, что для этого потребовалось одно из следующих действий:

void calcHist( const Mat* images, int nimages,
                      const int* channels, InputArray mask,
                      OutputArray hist, int dims, const int* histSize,
                      const float** ranges, bool uniform=true, bool accumulate=false );

void calcHist( const Mat* images, int nimages,
                      const int* channels, InputArray mask,
                      SparseMat& hist, int dims,
                      const int* histSize, const float** ranges,
                      bool uniform=true, bool accumulate=false );

И в моем коде у меня есть следующее:

if(histMat.size > 0)
{
    float hranges[2] = {0, 180};
    float* phranges = hranges;

    cv::Mat hist;
    cv::Mat hsv;
    cv::Mat hue;
    cv::Mat mask;

    cvtColor(histMat, hsv, CV_BGR2HSV);

    int _vmin = vmin, _vmax = vmax;

    inRange(hsv, cv::Scalar(0, smin, MIN(_vmin,_vmax)),
        cv::Scalar(180, 256, MAX(_vmin, _vmax)), mask);
    int ch[] = {0, 0};

    hue.create(hsv.size(), hsv.depth());
    mixChannels(&hsv, 1, &hue, 1, ch, 1);

    if(eType == MODEL)
    {
        cv::Mat roi(hue, selection), maskroi(mask, selection);
        cv::calcHist(&roi, 1, 0, maskroi, hist, 1, &hsize, &phranges);
        cv::normalize(hist, hist, 0, 255, CV_MINMAX);

        trackWindow = selection;

        histimg = cv::Scalar::all(0);
        int binW = histimg.cols / hsize;
        cv::Mat buf(1, hsize, CV_8UC3);
        for( int i = 0; i < hsize; i++ )
            buf.at<cv::Vec3b>(i) = cv::Vec3b(cv::saturate_cast<uchar>(i*180./hsize), 255, 255);
        cvtColor(buf, buf, CV_HSV2BGR);

        for( int i = 0; i < hsize; i++ )
        {
            int val = cv::saturate_cast<int>(hist.at<float>(i)*histimg.rows/255);
            cv::rectangle( histimg, cv::Point(i*binW,histimg.rows),
                cv::Point((i+1)*binW,histimg.rows - val),
                cv::Scalar(buf.at<cv::Vec3b>(i)), -1, 8 );
        }
    }
}

Я пытаюсь выяснить, что я могу изменить, чтобы этот код компилировался. Также обратите внимание, что этот кусок кода находится в функции для класса. Я пытаюсь разделить большую часть примера кода гистограммы на отдельную функцию, которая вызывается только в определенных точках, поэтому я не уверен, имеет ли это какое-либо отношение к тому факту, что phranges установлен в неподходящем месте или мои переменные установлены неправильно.

Любой совет с благодарностью.

Спасибо

Ответы [ 2 ]

1 голос
/ 23 июля 2011

Я взглянул на документацию и обнаружил следующие функции, которые немного отличаются от ваших:

void calcHist(const Mat* arrays, int narrays, const int* channels, const Mat& mask, 
              MatND& hist, int dims, const int* histSize, const float** ranges,
              bool uniform=true, bool accumulate=false)

void calcHist(const Mat* arrays, int narrays, const int* channels, const Mat& mask, 
              SparseMat& hist, int dims, const int* histSize, const float** ranges,
              bool uniform=true, bool accumulate=false)

В любом случае, если вы получаете ошибку неоднозначности во время компиляции, проблема связана не с openCV, а с C ++. 2 версии функции идентичны, за исключением параметра Hist, который отвечает за неоднозначность, и компилятор не знает, какую из них вызывать.

В вашем коде вы объявили переменную hist следующим образом:

cv::Mat hist;

Я думаю, вы должны объявить это либо:

cv::MatND hist;

или

cv::SparseMat hist;

или приведение cv :: Mat к соответствующему типу, чтобы указать компилятору, какая версия функции должна вызываться.

0 голосов
/ 26 июля 2011

Как уже упоминалось в моем комментарии выше, я должен был поместить все переменные в область действия функции, а не в саму проверку if.Я не уверен, почему это имело значение, но, возможно, это было чем-то, что нужно было сделать во время компиляции.

...