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 구조)
'딥러닝(Deep Learning) > 컴퓨터 비전' 카테고리의 다른 글
허프 변환(Hough Transformation)(Feat. 컴퓨터 비전과 딥러닝 p131) (1) | 2024.01.04 |
---|---|
cv2.findContours() (Feat. 컴퓨터 비전과 딥러닝, P129) (2) | 2024.01.04 |
캐니 에지(Canny Edge)(feat. false positive) (2) | 2024.01.02 |
물체 인식(Object Recongnition) vs 의미 분할(Semantic Segmentation) (0) | 2023.12.31 |
png 파일과 jpg(jpeg) 파일의 차이점(feat. Alpha 채널) (2) | 2023.12.27 |