OpenCV中的pointPolygonTest

时间:2012-06-26 14:50:35

标签: c++ opencv

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

我尝试使用this tutorial中的代码。

我使用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>。 不幸的是,文档对格式不是很清楚。

有人有建议吗?

1 个答案:

答案 0 :(得分:3)

  

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

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

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

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

  

您可以假设您可以随时使用InputArray / OutputArray   使用Mat,std :: vector&lt;&gt ;,Matx&lt;&gt;,Vec&lt;&gt;或标量。

因此,这意味着您可以将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])

希望它有所帮助。