在OpenCV中使用calcHist()函数的参数列表错误

时间:2012-08-20 22:00:45

标签: visual-studio-2010 visual-c++ image-processing opencv histogram

我试图使用以下代码:

    cv::MatND hist;
    cv::Mat image = cv::imread("image.bmp");
    float *range = new float[33];
    int histSize = 32;
    int channel = 0;
    for (int i = 0; i < 33; ++i)
        range[i] = (float)6602.0 + 21*i;
    float **ranges = &range;
    cv::calcHist(&frame.get<0>(), 1, &channel, cv::Mat(), hist, 1, &histSize, ranges, false, false);

图像是灰度的,所以我使用第0个通道来获得直方图,我知道范围是均匀的但我想要准确地知道我的边界,并且图像是CV_16U类型(在原始代码中从相机读取图像,但这里包含的时间太长了)

我的问题是在编译时我遇到以下错误:

    error C2665: 'cv::calcHist' : none of the 3 overloads could convert all the argument types
    C:\opencv\build_x64\include\opencv2/imgproc/imgproc.hpp(670): could be 'void     cv::calcHist(const cv::Mat *,int,const int *,cv::InputArray,cv::OutputArray,int,const int *,const float **,bool,bool)'
    C:\opencv\build_x64\include\opencv2/imgproc/imgproc.hpp(676): or 'void cv::calcHist(const cv::Mat *,int,const int *,cv::InputArray,cv::SparseMat &,int,const int *,const float **,bool,bool)'
    while trying to match the argument list '(cv::Mat *, int, int *, cv::Mat, cv::MatND, int, int *, float **, bool, bool)'

我知道这有点傻,但我要发疯了。任何帮助表示赞赏。 PS:我在64位环境下使用Microsoft Visual C ++ Express上的opencv 2.4.2。

最佳,

巴里斯

1 个答案:

答案 0 :(得分:0)

如果你的OpenCV版本比2.3更新,似乎是这种情况,你应该知道cv::Matcv::MatND是合并的。

但是关于错误,就像在新的OpenCV cv::Mat中可以有任意数量的维度一样,他们已经更改了定义,正如您所见here

C++: 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 )
C++: 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 )

您还可以在全新的教程here中看到一个简单的cv::Mat可以解决问题:

cv::Mat hist;

使用new documentation可以帮助您清除这些内容,遗憾的是,大多数可用的教程和代码都基于旧的OpenCV,后者已经对当前版本进行了重大更改。