簡體   English   中英

檢查cv :: Point是否在cv :: Mat中

[英]Check if a cv::Point is inside a cv::Mat

有誰知道Opencv是否提供了一個函數來檢查cv :: Point是否在cv :: Mat中?

基本上我在做:

int x = (current.x - offset);
int y = current.y;
if (x >= 0 && y >= 0 && x < mat.cols &&  y < mat.rows) && ((int)mat.at<uchar>(y, x) == 0)){
        return cv::Point(x, y);
    }
}

我想知道是否有更快的東西? 或者如果這樣做不好?

你可以構造一個大小為cv::Matcv::Rect並使用它的contains()方法:

cv::Rect rect(cv::Point(), mat.size());
cv::Point p(x, y);

if (rect.contains(p) && mat.at<uchar>(y, x) == 0)
{
  return p;
}

或者,如果索引超出范圍,您可以在at()捕獲異常:

UPD:正如@Antonio在評論中正確提到的,以下僅適用於調試模式,因為“ 為了更高的性能,索引范圍檢查僅在調試配置中執行 ”,這有點令人驚訝且不同從std::vector::at()工作原理。

try
{
  if (mat.at<uchar>(y, x) == 0)
  {
    return cv::Point(x, y);
  }
}
catch (cv::Exception& e)
{
}

但是,請注意異常導致的潛在性能損失。 如果此語句在循環中執行或者經常執行,則不應使用后一種方法。 或者萬一是正常而非特殊情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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