如何确定 cv::Mat 是不是有任何零值?

Posted

技术标签:

【中文标题】如何确定 cv::Mat 是不是有任何零值?【英文标题】:How to determine if a cv::Mat has any zero values?如何确定 cv::Mat 是否有任何零值? 【发布时间】:2018-07-23 11:00:48 【问题描述】:

我有一个“面具”图像,我需要知道它是否有任何零值。我想做一些相当于:

bool HasMissingPixels(const cv::Mat& mask) 
     return cv::countNonZero(image) < mask.rows * mask.cols;

感觉找到所有(非)零点就像在浪费计算,因为它可以在遇到第一个零像素时立即返回真。另一方面,通过自己迭代像素,我失去了OpenCV 的优化、并行化等优势。

有没有办法更快地计算?

【问题讨论】:

如何调整countNonZero的opencv代码并用openCV正确编译?应该给你同样的优化。我不知道类似“cv::hasZeroValues”的函数,但也许这只是缺乏知识:) “感觉就像......”请在做出假设之前先介绍一下 @Miki - 真的! :) 【参考方案1】:

针对最坏的情况(“数组中没有零值元素”)进行优化通常是有意义的,因为这样您的系统将具有可预测的运行时行为。因此使用countNonZerominMaxLoc 是实现目标的好函数。

提前中断的迭代方法是否更快完全取决于数据(“在大多数情况下,矩阵的早期是否存在零值?”)。您会在 OpenCV 之类的库中发现没有这样的功能,因为库维护者不知道您的数据,也无法编写针对您的自定义数据分布进行优化的代码。

【讨论】:

以上是关于如何确定 cv::Mat 是不是有任何零值?的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)

cv::Mat 类是不是存在设计缺陷?

如何清除 cv::Mat 内容?

将一行 cv::Mat 转换为 std::vector

英特尔 SIMD - 如何检查 __m256* 是不是包含任何非零值

如何根据公差更改 cv :: Mat 值