如何确定 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】:针对最坏的情况(“数组中没有零值元素”)进行优化通常是有意义的,因为这样您的系统将具有可预测的运行时行为。因此使用countNonZero
或minMaxLoc
是实现目标的好函数。
提前中断的迭代方法是否更快完全取决于数据(“在大多数情况下,矩阵的早期是否存在零值?”)。您会在 OpenCV 之类的库中发现没有这样的功能,因为库维护者不知道您的数据,也无法编写针对您的自定义数据分布进行优化的代码。
【讨论】:
以上是关于如何确定 cv::Mat 是不是有任何零值?的主要内容,如果未能解决你的问题,请参考以下文章
在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)