15

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

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

4

1 回答 1

22

您可以构造一个cv::Rect大小为 thecv::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 在评论中正确提到的那样,以下仅在调试模式下有效,因为“为了更高的性能,索引范围检查仅在调试配置中执行”,这有点令人惊讶并且不同从如何std::vector::at()工作。

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

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

于 2013-06-21T13:25:19.713 回答