본문 바로가기

딥러닝(Deep Learning)/컴퓨터 비전

cv.RETR_LIST(Feat. 컴퓨터 비전과 딥러닝 P128)

cv.findContours(img,cv.RETR_LIST, ~~) 함수의 두 번재 인자( cv.RETR_LIST ,cv.RETR_EXTERNAL, cv.RETR_CCOMP,

cv.RETR_TREE )는 구멍이 있는 경우 바깥쪽 경계선과 그 안에 있는 구멍의 경계선을 계층적으로 찾는 방식을 지정

하는 것이다. 

경계선(Contour)를 찾는 방법이란 구체적으로 바깥 경계선과 내부 경계선 간의 부모-자식 관계를 만들 것인가 안 만들 것인

가로 생각해 볼 수가 있다. 

 

내부에 [구멍]이 있는 경우

만약 계층 구조를 구축하는 cv.RETR_TREE 등을 사용한다면,

등고선 간의 부모-자식 관계가 나타날 것이며, 내부의 사각형이 바깥쪽 테두리를 포함한다는 관계가 표현됩니다.

(이때, 내부 사각형이 부모이고, 바깥쪽 사각형이 자식이 된다)

import cv2

img = cv2.imread('example_image.jpg', cv2.IMREAD_GRAYSCALE)
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# 등고선 그리기
cv2.drawContours(img, contours, -1, (0, 255, 0), 2)

# 결과를 보여주기
cv2.imshow('Contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

고로, cv2.RETR_TREE로 설정을 하게 되면 hierarcy 객체를 반환을 하게 된다. 

그러나, p128의 그림의 경우, 그 그림에서는 구멍이 존재하지 않으므로, 결과적으로 cv.RETR_LIST로 설정을 하게 되면

바깥쪽 Contour만 그려지게 된다. 

cv2.RETR_LIST는 계층 구조를 구축하지 않고 단순한 목록으로 반환한다. 

즉, 구멍에 대한 경계선과 그 구멍을 포함하는 바깥쪽 경계선에 대한 계층 관계를 구축하지 않는다. 

2 종류의 경계선을 독립적인 별도의 경계선으로 보고, 모든 경계선을 단순한 목록으로 만들어 반환을 한다. 

고로, hierarchy 객체를 반환하지 않으므로, '_'  처리를 하여 반환 받아도 된다. 

 

 

cv2.RETR_EXTERNAL : 외곽 윤곽선만 검출하며, 계층 구조를 구성하지 않습니다.

cv2.RETR_LIST : 모든 윤곽선을 검출하며, 계층 구조를 구성하지 않습니다.

cv2.RETR_CCOMP : 모든 윤곽선을 검출하며, 계층 구조는 2단계로 구성합니다.

cv2.RETR_TREE : 모든 윤곽선을 검출하며, 계층 구조를 모두 형성합니다. (Tree 구조)