我试图使用以下代码:
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 = ⦥
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。
最佳,
巴里斯
答案 0 :(得分:0)
如果你的OpenCV版本比2.3更新,似乎是这种情况,你应该知道cv::Mat
和cv::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,后者已经对当前版本进行了重大更改。