FindContours 操作后只提取一个轮廓

Posted

技术标签:

【中文标题】FindContours 操作后只提取一个轮廓【英文标题】:extract only one contour after FindContours operation 【发布时间】:2011-11-18 16:10:47 【问题描述】:

我目前正在使用 FindContours 和 DrawContours 函数来分割图像。

我只提取外部轮廓,并且只想保存包含给定点的轮廓。 我使用 h_next 遍历 cv_seq 结构并使用 PointPolygonTest 测试该点是否包含

我实际上可以找到我感兴趣的轮廓,但我的问题是提取它。

这是python代码:

def contour_from_point(contours, point, in_img):
"""
Extract the contour from a sequence of contours which contains the point.
For this to work in the eagle road case, the sequence has to be performed using the 
FindContours function with CV_RETR_EXTERNAL
"""
if contours:
    # We got at least one contour. Search for the one which contains point
    contour = contours # first contour of the list
    distance = cv.PointPolygonTest(contour, point, 0)
    while distance < 0: # 0 means on eadge of contour
        contour = contour.h_next()       
        if contour: # avoid end of contours
            distance = cv.PointPolygonTest(contour, point, 0)
        else : 
            contour = None

else:# 
    contour = None  

return contour

最后,我得到了轮廓。但是这个结构仍然包含所有尚未测试的轮廓。 如何只保留输出序列的第一个轮廓?

提前致谢!

【问题讨论】:

我不熟悉python语法,但为什么不直接访问轮廓结构的第一个元素并将其设置为一个单独的数组? 嗨。感谢你的回答。唯一发现的是使用 var = contour[:] 检索轮廓的所有点。但是这个输出不能被内部的 Opencv Drawfunction 使用。事实上,我想要的是一个只包含我想要的轮廓的 CvSeq。 :s. 终于有了一种只得到一个轮廓的方法。 Juste 使用另一个需要输入 cvseq 的函数,例如 ConvexHull。输出将只是序列的第一个轮廓。 【参考方案1】:

终于有一种方法可以只得到一个轮廓。 Juste 使用另一个需要输入 cvseq 的函数,例如 ConvexHull。输出将只是序列的第一个轮廓。

【讨论】:

以上是关于FindContours 操作后只提取一个轮廓的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV示例学习笔记-contours2.cpp-通过findContours 函数实现轮廓提取

图像轮廓之查找并绘制轮廓

从轮廓中提取最外层轮廓

OpenCV与EmguCV中的图像轮廓提取

OpenCV findContours,如何检查两边的颜色

轮廓发现