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

时间:2018-12-20 10:44:48

标签: c++ opencv

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

2 个答案:

答案 0 :(得分:1)

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

#include <algorithm>

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

答案 1 :(得分:1)

@francesco的回答对于C ++而言是不错的选择,但实际上并没有效果或功能。

更有效的方法是使用称为an answer here的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>());