c - opencv calcHist error



当我试图计算直方图并想知道我是否错过了一些东西时,我在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设置在不适当的地方或我的变量设置不当有任何关系。

请多多指教。

谢谢

我看了一下文档,发现了以下函数,它们与您的函数有点不同:

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++相关。函数的两个版本是相同的,除了hist形参,它造成了歧义,编译器不知道调用哪一个。

在您的代码中,您声明了hist变量,如下所示:
cv::Mat hist;

我认为你必须这样声明:

cv::MatND hist;

或:

cv::SparseMat hist;

或将cv::Mat强制转换为适当的类型,以指示编译器应该调用哪个版本的函数。

正如我在上面的评论中提到的,我必须将所有变量放在函数作用域中,而不是放在if检查本身中。我不确定为什么会有不同,但也许它在编译时做了一些事情。

相关内容

  • 没有找到相关文章

最新更新