我有一个矩阵cv::mat A
。
有没有一种简单的方法可以检查此矩阵的所有元素是否为正或等于0,如果此条件为true,则返回True布尔值?
答案 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>());