opencv calcHist错误

时间:2011-07-22 18:27:05

标签: c image-processing opencv histogram

当我试图计算直方图并且想知道我是否遗漏了某些东西时,我在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 个答案:

答案 0 :(得分:1)

我看了一下文档,发现了以下函数,这些函数与你的函数有点不同:

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强制转换为适当的类型,以指示编译器调用哪个版本的函数。

答案 1 :(得分:0)

正如我在上面的评论中所提到的,我必须将所有变量放在函数范围中而不是if检查本身。我不确定为什么会产生影响,但也许它在编译期间有事可做。