[英]Check if all elements of a cv::mat are positive or equal to 0
我有一個矩陣cv::mat A
有沒有一種簡單的方法可以檢查此矩陣的所有元素是正數還是等於0,如果此條件為真,則返回True布爾值?
@francesco在C ++方面的答案很好,但不是真正有效也不是功能性的。
更有效的方法是使用名為checkRange()的 OpenCV內置操作,它還提供第一個無效元素的位置並支持多通道數組。
用法示例:
cv::Point *pos;
bool is_ok = cv::checkRange( A, pos, 0, DBL_MAX );
正如@MarkSetchell在評論中建議的那樣,您可能還會在矩陣中找到最小值並查看它是否為非負值。 在數組上有一個名為minMaxLoc()
OpenCV操作,遺憾的是它不適用於多通道數組,所以你必須首先將整個數組重新minMaxLoc()
為單通道。
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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.