在OpenCV中找到一组点的轮廓

5
我尝试使用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在新图像上查找轮廓

1
已经过去2年了,所以您可能已经有了解决问题的方法。我遇到了同样的问题。因此,我认为OpenCV文档中描述MSER返回“轮廓”的部分是不正确的:"//在指定的图像上运行提取器;返回MSERs, //每个编码为轮廓(vector<Point>,请参见findContours) //可选的掩模标记了搜索MSER的区域(...)" - Jim Raynor
3个回答

1

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

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

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


1
创建一个图像并绘制您列出的点,然后findContours()可以完成其余的工作。是的,我认为这是最简单的方法(我在帖子底部写了)。但我不知道在图像上快速绘制点序列的方法。你能帮我吗? - Alexander Kholodovitch

1

获取任何形状的点最常见的方法是对轮廓使用凸包。(Hull 教程)

但是,如果您只想找到每个方向上的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 "使用OpenCV查找轮廓的极点"


0
如果我理解正确,你正在寻找检测到的物体的角落。
您可以遍历轮廓列表并编写一个简单的逻辑来通过进行简单的坐标比较来检测4个角。

1
我认为这不是一个好的答案。如果他有不同的形状需要更多的角来制作轮廓呢?简单的逻辑变得不容易编写。 - krzych
也许karlphillip的意思是凸包? - rwong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接