【问题标题】:OpenCV get condition base maximum element location from matrixOpenCV从矩阵中获取条件基最大元素位置
【发布时间】:2012-04-22 10:53:01
【问题描述】:

我检查了 minMaxLoc 但它只给出了矩阵的最大和最小位置。我需要找到最大或等于其他数字。例如(abc >=7) 然后给出矩阵中适用此条件的所有位置。

Matlab 示例: [a,b] = find( heMap >= (max(max(heMap)) ) );

那么我怎样才能满足 opencv 中获取特定最大值或最小值的条件。?请帮忙

问候

目前我正在使用这种方式

double getMaxValue(Mat hemap)
{
MatConstIterator_<double> it = hemap.begin<double>(), it_end = hemap.end<double>();
double maxdata=0;

for(; it != it_end; ++it)
{
    if(*it>maxdata)
    {
        maxdata = *it;
    }
}

return maxdata;
}

【问题讨论】:

    标签: c++ opencv matrix max


    【解决方案1】:

    我不知道任何内置函数,它正是这样做的。您可以将您的矩阵与为您提供布尔矩阵的元素进行比较。但我不知道有任何函数可以为您提供每个非零元素的位置,例如 find

    但是循环遍历数组并自己进行比较非常简单:

    int thresh = 50;
    for(int y=0;y<matrix.rows; y++)
      for(int x=0;x<matrix.cols; x++)
        if( matrix.at<uchar>(y,x) >= thresh)
          printf(" (%d,%d) = %d\n",x,y, matrix.at<uchar>(y,x));
    

    【讨论】:

    • 感谢您的回复,我已经尝试过那个循环部分,但我想知道是否无论如何我可以用仿函数或其他东西更改迭代部分......我在我的问题中尝试了上面的代码,我添加了编辑一个
    【解决方案2】:

    cv::compare 函数怎么样,它将每个像素与给定的数字进行比较,如果条件满足,则将输出数组设置为 255,否则为 0。

    【讨论】:

      【解决方案3】:

      我给你一个2+1步骤的解决方案:

      1. 使用minMaxLoc() 获得最大值 -> max_val。

      2. 使用inRange(input, max_val, max_val, output_mask) 将所有最大元素变为白色。

      3. 决定如何处理这些位置。
        比如说,您可以轻松检测热点、max-es 的大块或 max-es 的连通分量。 (用扩张和腐蚀,然后 在现场中心使用 floodFill,一个接一个。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-12
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 2014-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多