检查cv::Point是否在cv::Mat内

Check if a cv::Point is inside a cv::Mat

本文关键字:cv Mat Point 检查 是否      更新时间:2023-10-16

有人知道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)
{
}

但是,请注意异常可能导致的性能损失。如果此语句是在循环中执行的,或者只是非常频繁地执行,则不应该使用后一种方法。或者在正常情况下而不是特殊情况下。