首页 文章

检测闭合轮廓

提问于
浏览
3

这是示例图片:

screenshot

我使用opencv来检测轮廓:

>>> fc = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
>>> contours = fc[0]

为了检测闭合轮廓,我想检查opencv返回的每个轮廓中的起点和终点,而我注意到无论opencv对象的形状如何都勾勒出每个对象的轮廓,所以我得到了这个结果:

>>> for contour in contours:
>>>    print(contour[0,:,:], contour[-1,:,:])
[[246  38]] [[247  38]]
[[92 33]] [[93 33]]

或者每个发现的轮廓都有闭合的路径

我在 findContour() 函数中搜索了可用方法的其他常量,但它似乎都返回了闭路径 .

那么是否有一些检测发现轮廓是否闭合的一般方法?


我在搜索之前用Google搜索并没有得到结果,但我在右侧看到类似问题的好候选人:How can i know if a contour is open or closed in opencv?建议我使用 cv2.isContourConvex(contour) ,但是:

>>> for contour in contours:
>>>    print(cv2.isContourConvex(contour))
False
False

还有另一个更新:contourArea看起来它可能提供答案(至少对于简单的轮廓)但我没有在上面的示例图像上测试任何其他内容:

>>> for contour in contours:
>>>     print(cv2.contourArea(contour))
0.0
12437.5

3 回答

  • 1

    如果您的示例图像是位图,即使单个像素已经有一个区域,因此它也具有轮廓 . 封闭的圆圈甚至有两个轮廓,一个在内侧,一个在外侧 . 半圆只有一个,横跨内外,并在末端掉头 .

    我想你想把这两个圆视为确实没有区域而只有一个“轮廓”的曲线 . 然后圆圈将是一条闭合曲线,半圆将是开放的 . 如果是这种情况,您的新问题是将位图转换为曲线 . 这并非易事,即使我们人类很容易在那里感知曲线,因为它需要定义一个算法和参数,将一个区域变成一条曲线 .

    我知道的一种方法是从位图中获取一个骨架,它基本上剥离了外面的像素层,直到你只剩下一堆连接点 . 我不熟悉opencv,但我可以想象它已经有了一些实用工具 . 此外,搜索"curve line detect opencv"在此处显示opencv-identifying-lines-and-curves作为第一个链接,以及其他一些点击 .

  • 0

    根据定义,闭合轮廓将具有单独的内部轮廓 .
    查看findContours()hierarchy 参数:

    hierarchy - 可选输出向量,包含有关图像拓扑的信息 . 它具有与轮廓数量一样多的元素 . 对于每个第i个轮廓轮廓[i],元素层次[i] [0],hiearchyi,hiearchy [i] [2]和hiearchy [i] [3]被设置为基于0的索引的轮廓 . 分别在同一层级,第一个子轮廓和父轮廓的下一个和前一个轮廓 . 如果轮廓i没有下一个,前一个,父级或嵌套轮廓,则层次结构[i]的相应元素将为负数 .

  • 0

    这不是一个蟒蛇的答案,可能为时已晚 . 根据我对Emgu的经验,任何零面积的轮廓都不会关闭 . 您还可以将该区域与其周长进行比较作为额外检查,如果它非常小,那么它绝对不会关闭 . 不规则的形状有时在其轮廓的某处有一个很小的封闭区域 .

    轮廓区域可以从中获得

    cvContourArea
    

    Emgu中的轮廓周长定义为

    cvArcLength(contour, CV_WHOLE_SEQ, 1);
    

相关问题