找到cv :: Mat的最大值

Río*_*ire 17 c++ opencv pointers iterator computer-vision

我试图找到a的最大像素值cv::Mat.

问题:*maxValue总是回归0.

从这个SO线程,我理解' max_element返回迭代器,而不是值.这就是我使用*maxValue'的原因

cv::Mat imageMatrix;

double  sigmaX = 0.0;
int ddepth = CV_16S; //  ddepth – The desired depth of the destination image


cv::GaussianBlur( [self cvMatFromUIImage:imageToProcess], imageMatrix, cv::Size(3,3), sigmaX);

cv::Laplacian(imageMatrix, imageMatrix, ddepth, 1);

std::max_element(imageMatrix.begin(),imageMatrix.end());

std::cout << "The maximum value is : " << *maxValue << std::endl;
Run Code Online (Sandbox Code Playgroud)

注意:如果min_element替换代替max_element,则minValue代替maxValue,*minValue将始终返回0.

shi*_*mar 37

您应该使用OpenCV内置函数minMaxLoc而不是std函数.

Mat m;
//Initialize m
double minVal; 
double maxVal; 
Point minLoc; 
Point maxLoc;

minMaxLoc( m, &minVal, &maxVal, &minLoc, &maxLoc );

cout << "min val : " << minVal << endl;
cout << "max val: " << maxVal << endl;
Run Code Online (Sandbox Code Playgroud)

  • 干杯@shivakumar!我用过'double minVal; double maxVal; cv :: minMaxLoc(imageMatrix,&minVal,&maxVal);` (2认同)
  • 如果您要查找的只是图像中的最大值,则 minMaxLoc 是一个相当慢的函数……在使用更广泛用途的函数时,这是一个难以避免的问题。 (2认同)
  • @Kiran OP显然对了解max的*location*并不感兴趣.现在,您可以使用`minMaxIdx`,这是实际提到的快速(我建议您更新您的答案).但是,如果你可以使用相同的函数来计算最大值,那么你将有一半的处理时间(不过是读取内存的一半).如果你有一个非常具体的问题并且使用更宽范围的库函数,那么你最终会得到一些不必要的计算,这是一般规则. (2认同)