【问题标题】:Find contour of the set of points in OpenCV在 OpenCV 中查找点集的轮廓
【发布时间】:2020-06-08 21:04:36
【问题描述】:

我尝试通过 OpenCV 的 MSER 检测在图像上查找对象。但是函数 cvExtractMSER 返回的不是轮廓,而是创建图形的点集 (CvSeq):

(1, 4), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 1), (4, 2), (4, 3), (4, 4), ...

但我只需要轮廓点:

(1, 4), (8, 4), (8, 1), (4, 1)

我怎样才能找到这个轮廓?

我认为,最简单(但不是最快)的方法是:

  • 用所有点绘制黑白图像(如何?逐点绘制?)
  • 使用findContours 在新图像上查找轮廓

【问题讨论】:

  • 已经 2 年了,所以您可能已经有了问题的解决方案。我遇到了同样的问题。因此,我认为描述 MSER 返回“轮廓”的 OpenCV 文档不正确:“//在指定图像上运行提取器;返回 MSER,//每个编码为轮廓(vector,请参阅 findContours ) // 可选掩码标记搜索 MSER 的区域 (...)"

标签: opencv computer-vision contour mser


【解决方案1】:

findContours() 中的一个选项是传递一个参数,该参数将删除水平、垂直或对角直线上的端点以外的所有点。如果您创建一个图像并绘制您列出的点,那么 findContours() 可以为您完成其余的工作。

CV_CHAIN_APPROX_SIMPLE 压缩水平、垂直和对角线段,只留下它们的端点。例如,一个直立的矩形轮廓用 4 个点进行编码。

http://opencv.itseez.com/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours#findcontours

【讨论】:

  • "创建一个图像并绘制您列出的点,然后 findContours() 可以完成剩下的工作" 是的,我认为这是最简单的方法(我在帖子底部写了它) .但我不知道在图像上绘制点序列的快速方法。你能帮帮我吗?
【解决方案2】:

获取任何形状的这些点的最通用方法是在轮廓上使用凸包。 (Hull Tutorial)

但是,如果您只在每个方向上寻找 4 个极值点,您可以简单地将轮廓视为 NumPy 数组(它们就是):

如果c 是轮廓:

extLeft = tuple(c[c[:, :, 0].argmin()][0])
extRight = tuple(c[c[:, :, 0].argmax()][0])
extTop = tuple(c[c[:, :, 1].argmin()][0])
extBot = tuple(c[c[:, :, 1].argmax()][0])

可以在这里找到更多信息:pyimagesearch.com "Finding Extreme Points in Contours with OpenCV"

【讨论】:

    【解决方案3】:

    如果我理解正确,您正在寻找检测到的物体的角落。

    您可以通过简单的坐标比较来遍历您的计数列表并编写一个简单的逻辑来检测 4 个角

    【讨论】:

    • 我认为这不是一个好的答案。如果他有不同的形状需要更多的角来制作轮廓怎么办?简单的逻辑变得不简单。
    • 也许 karlphillip 的意思是凸包?
    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2016-08-04
    相关资源
    最近更新 更多