1

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

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

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

问题是pointPolygonTest接受 acv::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>. 不幸的是,文档对格式不是很清楚。

有人有建议吗?

4

1 回答 1

4

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

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

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

如您所见,第一个参数是InputArray而不是矩阵。从那篇文章:

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

因此,这意味着您可以使用std::vector<vector<Point> >asInputArray和 so 作为函数的输入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])

希望能帮助到你。

于 2012-06-26T15:12:04.453 回答