在OpenCV中查找点集的轮廓

时间:2012-04-24 12:21:39

标签: opencv computer-vision contour mser

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

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

Area created by set of points

但我只需要轮廓点:

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

Highlight needed contour points

我如何才能找到这个轮廓?

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

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

3 个答案:

答案 0 :(得分: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 :(得分:1)

获取任何形状的这些点的最通用方法是在轮廓上使用凸包。 (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"

答案 2 :(得分:0)

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

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