我想使用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>
。
不幸的是,文档对格式不是很清楚。
有人有建议吗?
答案 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])
希望它有所帮助。