有没有人知道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);
}
}
我想知道是否有更快的东西?或者如果这样做不好么?
答案 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)
{
}
但是,请注意异常导致的潜在性能损失。如果此语句在循环中执行或者经常执行,则不应使用后一种方法。或者万一是正常而非特殊情况。