【问题标题】:How to compute maximum pixel value of Mat in OpenCV [duplicate]如何在 OpenCV 中计算 Mat 的最大像素值 [重复]
【发布时间】:2012-09-20 22:33:18
【问题描述】:

这应该是显而易见的,我想。但是我找不到在 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;
}

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

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

    Mat m = ...;
    
    double min, max;
    minMaxIdx(m, &min, &max);
    
    printf("min: %f, max: %f\n", min, max);
    

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

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

    【讨论】:

    • 这是我的首选,因为它允许使用更高效的低级代码,而不是通用迭代器。
    【解决方案2】:

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

    std::max_element(Mat.begin<double>(),Mat.end<double>());
    

    【讨论】:

    • 可能值得一提的是 max_element 返回一个迭代器。
    • 一个注意事项:我希望 Mat 迭代器会很慢,因为在每次增量时,它都必须检查是否到达行尾(矩阵可能是不连续的,并且可能还有填充字节)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2019-05-04
      相关资源
      最近更新 更多