检查cv::mat的所有元素是否为正或等于0

Check if all elements of a cv::mat are positive or equal to 0

本文关键字:是否 元素 mat cv 检查      更新时间:2023-10-16

我有一个矩阵cv::mat A。有没有一种简单的方法可以检查这个矩阵的所有元素是否为正或等于0,如果这个条件为True,则返回True布尔值?

@francisco的答案在C++方面很好,但并不真正有效,也不实用。

更有效的方法是使用名为checkRange()的OpenCV内置操作,它还提供了第一个无效元素的位置,并支持多通道数组。

示例用法:

cv::Point *pos;
bool is_ok = cv::checkRange( A, pos, 0, DBL_MAX );

正如@MarkSetchell在评论中建议的那样,您也可以在矩阵中找到最小值,并查看它是否为非负。数组上有一个名为minMaxLoc()的OpenCV操作,不幸的是,它不适用于多通道数组,因此您必须首先将整个数组重新编译为单个通道。

double min;
cv::minMaxLoc( A.reshape(1), &min );

要使francescos解决方案工作,您必须为迭代器指定cv::Mat类型,例如,对于矩阵的CV_8U类型

bool is_all_positive = (std::find_if(m.begin<uchar>(), m.end<uchar>(),
[](auto x) { return (x < 0); }) == m.end<uchar>());

正如我之前所说,这不是一种有效的方法,而且(在我看来)比checkRange()更有用,以防我们想比较特定通道的值——例如,只检查BGR图像中的蓝色值

bool is_all_positive = (std::find_if(m.begin<cv::Vec3b>(), m.end<cv::Vec3b>(),
[](auto x) { return (x[0] < 0); }) == m.end<cv::Vec3b>());

要有一个有效的方法,而不是使用迭代矩阵所有元素的过程,您应该使用一个在找到条件后立即停止的方法。您可以使用std::find_if

#include <algorithm>
bool is_all_positive = (std::find_if(A.begin(), A.end(),
[](auto x) { return (x < 0); }) == A.end());
相关文章: