9

这应该是显而易见的,我想。但是我找不到在 OpenCV Mat 的所有像素中找到最大值的简单方法。当然,我可以对每种像素类型进行以下操作。但是一般的 max 函数仍然有用。

double cvMax(cv::Mat& mat)
{
float max=0;
float* pData=(float*)mat.data;
for(int i=0;i<mat.rows;i++) 
{
    for(int j=0;j<mat.cols;j++)
    {
        float value = pData[j+i*mat.cols];
        if(value>max) 
        {
            max=value;
        }
    }
}
return max;
}
4

3 回答 3

20

cv::minMaxIdx使用起来真的很简单。它在文档中看起来很复杂,但您可以省略大部分参数:

Mat m = ...;

double min, max;
minMaxIdx(m, &min, &max);

printf("min: %f, max: %f\n", min, max);

而且,比 .cv::minMaxIdx快 10 倍以上std::max_element。这是因为cv::minMaxIdx针对处理cv::Mat数据进行了优化,并且尽可能使用多个线程。

如果您还需要图像中的最小值和最大值的位置,可以使用cv::minMaxLoc.

于 2014-10-16T17:01:16.443 回答
17

您始终可以将 std max_element函数与来自 opencv 的迭代器一起使用

std::max_element(Mat.begin<double>(),Mat.end<double>());
于 2012-09-20T22:40:38.353 回答
9

您还可以使用 cv::minMaxLoc 内置函数。不过,在您的情况下, std::max_element 更简单。

于 2012-09-21T03:19:07.953 回答