簡體   English   中英

檢查cv :: mat的所有元素是正數還是等於0

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM