web-dev-qa-db-ja.com

CV_RETR_LIST、CV_RETR_TREE、CV_RETR_EXTERNALの違いは?

OpencvのcvFindContour関数を使用していますが、その中にパラメータRETR_TYPEが検索タイプを意味します。したがって、CV_RETR_LISTCV_RETR_TREECV_RETR_EXTERNALの違いは何ですか?

21
ATG

findContoursのドキュメント を見てください。

主な違いは、返されるhierarchyにあります(1つの輪郭と次の輪郭の関係を示します)。

  • CV_RETR_EXTERNALは「外側の」輪郭を与えるので、(たとえば)ある輪郭が別の輪郭を囲んでいる場合(同心円のように)、最も外側の輪郭だけが与えられます。
  • CV_RETR_LISTはすべての輪郭を示し、hierarchyの計算もしません。輪郭だけが必要で、輪郭が別の輪郭の中にネストされているかどうかを気にしない場合に適しています。
  • CV_RETR_CCOMP輪郭を与え、それらを外側と内側の輪郭に編成します。すべての輪郭は、オブジェクトの輪郭、またはオブジェクトの輪郭のいずれかですinside別のオブジェクト(つまり、穴)。 hierarchyはそれに応じて調整されます。これは、(たとえば)すべての穴を見つけたい場合に役立ちます。
  • CV_RETR_TREE等高線の完全な階層を計算します。つまり、object1はobject2内に4レベル深くネストされており、object3も4レベル深くネストされていると言えます。
26

imgproc.cppから:

//! mode of the contour retrieval algorithm
enum RetrievalModes {
    /** retrieves only the extreme outer contours. It sets `hierarchy[i][2]=hierarchy[i][3]=-1` for
    all the contours. */
    RETR_EXTERNAL  = 0,
    /** retrieves all of the contours without establishing any hierarchical relationships. */
    RETR_LIST      = 1,
    /** retrieves all of the contours and organizes them into a two-level hierarchy. At the top
    level, there are external boundaries of the components. At the second level, there are
    boundaries of the holes. If there is another contour inside a hole of a connected component, it
    is still put at the top level. */
    RETR_CCOMP     = 2,
    /** retrieves all of the contours and reconstructs a full hierarchy of nested contours.*/
    RETR_TREE      = 3,
    RETR_FLOODFILL = 4 //!<
};

OpenCV 2.4.1

1
tomfriwel