Я использую функцию cvFindContour для opencv, и в ней есть параметр RETR_TYPE означает тип извлечения, поэтому я не понимаю, в чем разница между CV_RETR_LIST
, CV_RETR_TREE
, CV_RETR_EXTERNAL
?
Разница между CV_RETR_LIST, CV_RETR_TREE, CV_RETR_EXTERNAL?
Ответ 1
Посмотрите документацию для findContours
.
Основное отличие заключается в возвращаемом hierarchy
(дающем соотношение между одним контуром и следующим).
-
CV_RETR_EXTERNAL
дает "внешние" контуры, поэтому, если у вас есть (скажем) один контур, окружающий другой (например, концентрические круги), дается только самая внешняя. -
CV_RETR_LIST
дает все контуры и даже не утруждает вычислениямhierarchy
- хорошим, если вы хотите только контуры и не заботитесь, вложен ли он внутри другого. -
CV_RETR_CCOMP
дает контуры и организует их во внешние и внутренние контуры. Каждый контур является либо контуром объекта, либо контуром объекта внутри другого объекта (т.е. Отверстия). Соответственно отрегулируетсяhierarchy
. Это может быть полезно, если (скажем) вы хотите найти все дыры. -
CV_RETR_TREE
вычисляет полную иерархию контуров. Таким образом, вы можете сказать, что object1 вложен в 4 уровня глубоко внутри объекта2, а object3 также вложен в 4 уровня.
Ответ 2
От 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.13