点多边形测试在OpenCV中
pointPolygonTest in OpenCV
我想使用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])
希望对您有所帮助。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 数据成员SFINAE的C++17测试:gcc vs clang
- 对 OpenCV C++ 程序进行单元测试,该程序拍摄照片并将其保存到文件中
- 测试构建C++包装器时出现 OpenCV 错误
- OpenCV 用于识别训练视频集中的对象,然后针对另一个视频对其进行测试
- 测试opencv-wwarpAffine的异常值数量
- 在OpenCV中测试parallel_for_性能
- 如何测试OpenCV SVM
- 使用opencv 3.0测试版进行鱼眼镜头校准
- 点多边形测试在OpenCV中
- 如何将OpenCV的测试框架与CMake一起使用?
- 为什么我在opencv 3.0测试版中找不到平衡白色