当我试图计算直方图并且想知道我是否遗漏了某些东西时,我在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设置在不适当的位置或者我的变量这一事实有关设置不当。
非常感谢任何建议。
由于
答案 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检查本身。我不确定为什么会产生影响,但也许它在编译期间有事可做。