当我试图计算直方图并想知道我是否错过了一些东西时,我在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检查本身中。我不确定为什么会有不同,但也许它在编译时做了一些事情。