检查cv::mat的所有元素是否为正或等于0
Check if all elements of a cv::mat are positive or equal to 0
我有一个矩阵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());
相关文章:
- 是否可以在c++中处理字符串流中的各个元素
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 如何知道地图中的最后一个元素是否被删除?
- 检查 TinyXML 中的元素是否存在
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- C++:是否可以编写一个函数,将不同类型的元素附加到变体数组中?
- 数组对象的生存期是否在重用其元素存储时结束?
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 是否可以使用宏来访问动态数组或向量中的元素或为其赋值
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 使用 at() 访问 std::map 元素是否比运算符 [] 慢?