【发布时间】: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...不是我所希望的,但它回答了我的问题。谢谢!