点多边形测试在OpenCV中

pointPolygonTest in OpenCV

本文关键字:OpenCV 测试 多边形      更新时间:2023-10-16

我想使用pointPolygonTest但我有一个问题。我的OpenCV版本是2.2。

我尝试使用本教程中的代码。

我使用findContours来检测图像中的轮廓。在 OpenCV 2.2 下返回一个vector<vector<Point> >

问题是pointPolygonTest接受cv::Mat作为条目。因此,代码无法使用 OpenCV 2.2 进行编译:

error: invalid initialization of reference of type ‘const cv::Mat&’ from expression of type ‘std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > >’

在较新的 OpenCV 版本中,findContours 函数返回vector<Mat>因此很容易传递给pointPolygonTest(请参阅示例)。

我想我可以将vector< vector<Point> >转换为vector<Mat>.不幸的是,文档对格式不是很清楚。

有人有建议吗?

问题是pointPolygonTest接受cv::Mat作为条目。

那么为什么要使用旧版本的OpenCV呢?以下是 OpenCV 版本 2.4.1 中此方法的声明:

C++: double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)

如您所见,第一个参数是输入数组而不是矩阵。来自那篇文章:

您可以假设您始终可以代替 InputArray/OutputArray 使用 Mat、std::vector<>、Matx<>、Vec<> 或 Scalar。

因此,这意味着您可以将std::vector<vector<Point> >用作InputArray,从而作为函数pointPolygonTest的输入。

以下是使用 pointPolygonTest 的简单示例(当然在新版本中):

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Mat src;
findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
for(size_t i = 0; i<contours.size(); i++)
{
    if (pointPolygonTest(contours[i], point, false) > 0)
    {
        //point is inside polygon
        ...
        break;
    }
}

因此,只需更新到新版本即可。

或者,如果您想在旧版本中使用它,请尝试以下转换:

    (Mat)contours[i]

或使用构造函数:

    Mat(contours[i])

希望对您有所帮助。