【问题标题】:How to remove a contour inside contour in Python OpenCV?如何在 Python OpenCV 中删除轮廓内的轮廓?
【发布时间】:2016-09-25 13:10:32
【问题描述】:

Python 中的 OpenCV 提供以下代码:

regions, hierarchy = cv2.findContours(binary_image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)


for region in regions:
    x, y, w, h = cv2.boundingRect(region)

    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 1)

这给出了轮廓内的一些轮廓。如何在 Python 中删除它们?

【问题讨论】:

    标签: python opencv contour


    【解决方案1】:

    为此,您应该查看this tutorial,了解如何使用方法findContours 返回的hierarchy 对象。

    重点是您应该使用cv2.RETR_TREE 而不是cv2.RETR_LIST 来获取集群之间的父/子关系:

    regions, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    

    然后您可以通过检查hierarchy[0,i,3] 是否等于-1 来检查索引为i 的轮廓是否在另一个轮廓内。如果它不同于-1,那么你的轮廓在另一个里面。

    【讨论】:

    • 谢谢!你救了我。
    • 即使在应用 cv2.RETR_TREE 后仍会在其他轮廓内获得轮廓,可以执行哪些步骤?怎样才能彻底解决?
    • 您不想使用 cv2.RETR_EXTERNAL,因为他想删除另一个轮廓内的所有轮廓吗?
    【解决方案2】:
    img_output, contours, hierarchy = cv2.findContours(blank_image_firstImage, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    

    这会移除子轮廓

    【讨论】:

    • 这只查找外部轮廓,不删除轮廓内的轮廓。如果整个图像有一个大轮廓,那么它只返回那个。
    • 谢谢!通过首先修复导致问题的步骤,这解决了我与原始问题相关的问题。
    猜你喜欢
    • 2020-06-14
    • 2022-01-23
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2023-03-21
    • 2014-07-12
    • 2019-03-20
    相关资源
    最近更新 更多