[英]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::Mat
的cv::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.