检查cv::Point是否在cv::Mat内
Check if a cv::Point is inside a cv::Mat
有人知道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)
{
}
但是,请注意异常可能导致的性能损失。如果此语句是在循环中执行的,或者只是非常频繁地执行,则不应该使用后一种方法。或者在正常情况下而不是特殊情况下。
相关文章:
- 将CHW格式的浮点向量转换为cv::Mat
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- 将 cv::Mat 转换为 std::vector 的通用函数
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- 如何将 cv::Mat 转换为 vtkImageData?
- 如何将 vtkImageData 转换为 cv::Mat?
- 如何总结所有cv::Mat元素
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 在 cv::Mat 中生成 2D 坐标网格
- 将 cv::Mat 转换为无符号的 int 像素
- OpenCV 分段错误(核心转储)在使用 cv::Mat::at 时
- 如何将多个 cv::Mat 从 c++ dll 传递到 opencvsharp Mat c#?
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- 如何使用 (*mpORBextractorLeft)(im,cv::Mat(),mvKeys,mDescriptors)
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 如何将 cv::mat 对象从 python 模块传递到 c++ 函数并返回返回的 cv::mat 类型为对象?
- 移动语义和 cv::Mat
- OpenCV 错误:断言在 cv::Mat 行 522 中失败