有谁知道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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更快的东西?或者如果这样做不好?
Mik*_*ail 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;
}
Run Code Online (Sandbox Code Playgroud)
或者,at()如果索引超出范围,您可以捕获异常:
UPD:正如@Antonio在评论中正确提到的,以下仅适用于调试模式,因为" 为了更高的性能,索引范围检查仅在调试配置中执行 ",这有点令人惊讶且不同从如何std::vector::at()运作.
try
{
if (mat.at<uchar>(y, x) == 0)
{
return cv::Point(x, y);
}
}
catch (cv::Exception& e)
{
}
Run Code Online (Sandbox Code Playgroud)
但是,请注意异常导致的潜在性能损失.如果此语句在循环中执行或者经常执行,则不应使用后一种方法.或者万一是正常而非特殊情况.
| 归档时间: |
|
| 查看次数: |
11180 次 |
| 最近记录: |