【问题标题】:Find maximum value of a cv::Mat查找 cv::Mat 的最大值
【发布时间】:2023-03-28 03:42:01
【问题描述】:

我正在尝试查找cv::Mat 的最大像素值。

问题:*maxValue 总是返回 0

this S.O. thread,我了解到'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;

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

【问题讨论】:

  • 也许 imageMatrix 是全零?尝试打印它以查看它包含的内容。
  • 感谢星尘_。我将它打印到控制台,但它不是。
  • 当我尝试使用std::max_element(imageMatrix.begin(),imageMatrix.end()); 时,我收到了错误No matching member function call to begin。我不完全理解&lt;typename_tp&gt;
  • 是的,我明白了,我以为这是一个普通的容器。我认为 OpenCV 有它自己的容器。也许这就是 std::max_element 对它们不起作用的原因。
  • imageMatrix 包含哪些元素?

标签: c++ pointers opencv iterator computer-vision


【解决方案1】:

您应该使用 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;

【讨论】:

  • 干杯@shivakumar!我用double minVal; double maxVal; cv::minMaxLoc(imageMatrix, &amp;minVal, &amp;maxVal);
  • minMaxLoc 是一个相当慢的函数,如果你正在寻找的只是图像中的最大值......使用更广泛的目的函数时这是一个难以避免的问题。
  • @Antonio 这个答案告诉 minMaxLoc 超级快-stackoverflow.com/a/26409969/1180117
  • @Kiran OP 显然对知道最大值的 位置 不感兴趣,而只是对值感兴趣。现在,您可以使用minMaxIdx,这是实际上提到的快速(我建议您更新答案)。但是,如果您可以使用相同的函数来计算最大值,那么您将进行一半的处理(虽然不是一半的内存读取)。如果您有一个非常具体的问题并且您使用范围更广的库函数,那么您最终会进行一些不必要的计算,这是一般规则。
  • @Kiran 最终可能不是(同时我改变了看法:))。我想迭代器的实现方式是检查它是否到达行尾。我希望它只是效率低下,但没有错。
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
相关资源
最近更新 更多