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

时间:2013-06-21 13:05:39

标签: c++ opencv

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

我想知道是否有更快的东西?或者如果这样做不好么?

1 个答案:

答案 0 :(得分:20)

您可以构建cv::Rect大小的cv::Mat并使用其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在评论中正确提到的,以下仅适用于调试模式,因为“For the sake of higher performance, the index range checks are only performed in the Debug configuration”,这有点令人惊讶,与{ {3}}有效。

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

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