web-dev-qa-db-ja.com

Python OpenCVで輪郭の内側の輪郭を削除する方法は?

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でそれらを削除する方法は?

12
Python1c

そのためには、メソッドhierarchyによって返されるfindContoursオブジェクトの使用方法について このチュートリアル を参照する必要があります。

重要な点は、クラスター間の親子関係を取得するには、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と異なる場合、輪郭は別の輪郭の内側にあります。

13
Sunreef