【问题标题】:Finding the min/max value in a Mat while ignoring -100在忽略 -100 的情况下查找 Mat 中的最小值/最大值
【发布时间】:2014-11-13 08:30:34
【问题描述】:

我正在尝试使用 opencv min() max() 或 MinMaxLoc() 来获取 Mat 中的最小值和最大值。我的垫子的结构方式,具有空数据或没有数据的数据点的值为 -100。这些 opencv 函数会忽略 -100 值,还是有办法在使用预定义函数忽略 -100 值的同时获得最小值?

替代方法是手动迭代整个 Mat 并计算最小值和最大值,同时忽略 -100,但如果可能,我想使用内置函数。为什么要重新发明轮子。

【问题讨论】:

  • OpenCV 文档的一个简短的 reduex 没有显示您有效想要的直接机制,即“给我最小值/最大值,忽略值 X”。使用哨兵值会以一种或另一种方式使您感到厌烦。您可以使用std::numeric_limits<double>::max() 来避免最小冲突和/或与“真实”最小值重叠,但这会影响您的“真实”最大值计算,反之亦然。如果有办法做到这一点,我还没有看到它,如果这样的东西被串在一起,我会很好奇。
  • 创建蒙版:cv::Mat mask = yourMat != -100;然后使用带有掩码参数的 minMaxLoc
  • @Micka 如果您为minMaxLoc 指定一个完全为零的掩码会发生什么?它是未定义的行为吗?如果是这样,在提供给方法之前检查掩码是否全为零是一种好习惯吗?...如果不是,如果我们确实提供了全零掩码,会返回什么?
  • @rayryeng 不知道,测试它或看看代码,它可能没有那么复杂。但我可以想象,对于 min 和 max,第一个元素被返回,所以如果 minVal==maxVal 整个矩阵都充满了该值
  • @Micka doh。为什么我没有想到呢?哈哈。我想到了。 github.com/opencv/opencv/blob/…。最小值和最大值设置为最初在数值限制中定义的 +/- 无穷大,因此如果掩码为空,则返回该掩码。 Eck...不是我所希望的,但它回答了我的问题。谢谢!

标签: c++ opencv max min mat


【解决方案1】:

你可以使用NANminMaxLoc会忽略它:

Mat C = (Mat_<double>(3,3) << 0, -1, NAN, -1, 5, -1, 0, -1, 0);
cout << "C = " << endl << " " << C << endl << endl;
SparseMat S = SparseMat(C);

double minVal, maxVal;
minMaxLoc( S, &minVal, &maxVal );
cout << "minVal = " << minVal << endl;
cout << "maxVal = " << maxVal << endl;

输出:

C = 
 [0, -1, nan;
  -1, 5, -1;
  0, -1, 0]

minVal = -1
maxVal = 5

顺便说一句,minmax 比较 两个元素(或大小相同的数组的元素对)并为您提供最小值或最大值,而不是找到全局最小值和最大值数组,所以这些可能不是你想要的。

【讨论】:

  • 那么,这些如何帮助 OP 忽略 -100 的值?
  • @hvd 这取决于 OP 是否愿意/能够用 NAN 替换 -100 值。
  • 当我在不降低性能的情况下创建我的 MAT 对象时,我可以将数组值更改为 NaN,然后​​使用 minMAxLoc()
  • 这并不总是有效。在包含 NaN 值的 CV_32FC1 Mat 中,minMaxLoc 给我一个最大值 -3.40282e+38,这是完全错误的。你最好戴上口罩。
  • @R2-D2 很有趣。你能给出一个发生这种情况的样本矩阵吗?如果你想这样做,我可以在聊天中使用。您确实将minValmaxVal 更改为float,不是吗?
猜你喜欢
  • 2021-08-12
  • 2020-01-08
  • 2015-01-25
  • 2023-03-28
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多