【发布时间】:2023-04-01 21:47:02
【问题描述】:
我想在植物叶子的边缘线上做一组相似距离的点(如下图所示)。我想在叶子的边缘线上制作红色的小方块。我将叶子边缘线的点集存储为轮廓。
有没有办法使用 OpenCV/C++ 做到这一点? (特别是我想要一种方法来存储这些点以供将来使用应用程序)
提前致谢。
【问题讨论】:
标签: c++ opencv image-processing contour edge-detection
我想在植物叶子的边缘线上做一组相似距离的点(如下图所示)。我想在叶子的边缘线上制作红色的小方块。我将叶子边缘线的点集存储为轮廓。
有没有办法使用 OpenCV/C++ 做到这一点? (特别是我想要一种方法来存储这些点以供将来使用应用程序)
提前致谢。
【问题讨论】:
标签: c++ opencv image-processing contour edge-detection
您需要为已经找到的轮廓计算approxPolyDP,approxPolyDP 以指定的精度逼近多边形曲线,您可以在其中调整参数 epsilon 以获得所需的结果。
在此处查看example,了解如何使用 approxPolyDP。
【讨论】:
FindContours 提取图像的轮廓。 (将您的图像转换为灰度,之前应用二进制阈值和精明边缘检测,以获得更好的结果。)
vector> 轮廓; cv::findContours(src_img, 轮廓, 层次结构, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
画出轮廓的所有点。代码示例:
cv::Mat draw = cv::Mat::zeros(500,500, CV_8UC3);
int contour_id = 1;
for(int i = 0;i
除此之外,您还可以对轮廓上的所有点使用ApproxPolyDP 或 PointPolygonTest Opencv 函数。请参阅完整的详细信息和代码示例here。正如您可以在链接上阅读的那样,此函数返回当点在轮廓之外时为负数的距离,当点在轮廓内时返回正数,如果点在轮廓上则返回零。 所以你必须只绘制返回零的点。
问候
【讨论】: