OpenCV | Contour | 컨투어를 통해 이미지의 윤곽선 검출하기

박나연·2020년 7월 27일
1

OpenCV

목록 보기
11/40
post-custom-banner

1 시작하기

컨투어(contour) 란, 윤곽이라는 뜻이다. OpenCV 에서 영상이나 이미지의 외곽 혹은 내곽을 검출해낼 수 있다. findContours 함수를 통해 이진화 이미지에서 윤곽선을 찾아낸다.


2 여러 함수들

2-1 두개의 도형을 다른 색으로 구분하기

import cv2 as cv

img_color = cv.imread('test1.png')
img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY)
ret, img_binary = cv.threshold(img_gray, 127, 255, 0)
contours, hierarchy = cv.findContours(img_binary, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE) # 컨투어 검출

cv.drawContours(img_color, contours, 0, (0, 255, 0), 3) # 인덱스0, 파란색
cv.drawContours(img_color, contours, 1, (255, 0, 0), 3) # 인덱스1, 초록색


cv.imshow("result", img_color)
cv.waitKey(0)

2-2 findContours

contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
대표적으로 바이너리 이미지, 컨투어 Retrieval 모드 (4), Approximation Method(3) 를 파라미터로 입력 후 컨투어를 찾는다.

반환값으로 윤곽선과 계층구조를 반환한다.


2-3 drawContours

image = cv.drawContours( image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]] )

컬러 이미지, 색깔, 인덱스를 입력하여 컨투어를 그린다.


2-1 에서,

cv.drawContours(img_color, contours, 0, (0, 255, 0), 3)

파란색으로 인덱스 0에 해당하는 컨투어를 3의 두께로 윤곽선을 그린다.

cv.drawContours(img_color, contours, 1, (255, 0, 0), 3)

초록색으로 인덱스 1에 해당하는 컨투어를 3의 두께로 윤곽선을 그린다.


2-4 결과


3 Contour Approximation Method

윤곽선에 포인터를 지정하는 방식을 의미한다.

cv.CHAIN_APPROX_NONE 모든 경계선에 포인터를 그린다.

cv.CHAIN_APPROX_SIMPLE 시작점과 끝점에만 포인터를 그린다.


3-1 윤곽선에 원을 그리는 두가지 방식

import cv2 as cv

img_color = cv.imread('test1.png')
img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY)
ret, img_binary = cv.threshold(img_gray, 127, 255, 0)
contours, hierarchy = cv.findContours(img_binary, cv.RETR_LIST, cv.CHAIN_APPROX_NONE) # 컨투어 검출

for cnt in contours:
    for p in cnt:
        cv.circle(img_color, (p[0][0], p[0][1]), 10, (255, 0, 0), -1) # 모든좌표마다 파란원을 그리도록 함
    

cv.imshow("result", img_color)
cv.waitKey(0)

3-2 정리

for cnt in contours:
    for p in cnt:
        cv.circle(img_color, (p[0][0], p[0][1]), 10, (255, 0, 0), -1) 
   

contours 에 저장된 윤곽선의 좌표 모두에 원을 그린다.
(원의 두께를 -1로 하여 원의 내부를 채움)

circle


3-3 결과

CHAIN_APPROX_NONE

CHAIN_APPROX_SIMPLE


4 Contour Retrieval Mode

컨투어의 결과를 어떤 식으로 리턴 할지에 대한 4가지 방식

[Next, Previous, First_Child, Parent]

컨투어의 좌표는 위와 같은 형태로 저장된다.

4-1 RETR_TREE

모든 윤곽선을 검출, 계층구조를 모두 형성

4-2 RETR_LIST

모든 윤곽선을 검출, 계층구조는 구성하지 않음

4-3 RETR_EXTERNAL

외곽 윤곽선만 검출, 계층구조는 구성하지 않음

4-4 RETR_CCOMP

모든 윤곽선을 검출, 계층구조는 2단계로 구성

4-5

계층 구조를 통해 외곽, 내곽 윤곽선, 같은 계층 구조를 구별할 수 있다.

이 정보들이 hierarchy 에 담겨있으며

[Next, Previous, First_Child, Parent] 형태로 결과를 반환한다.

[다음 윤곽선, 이전 윤곽선, 내곽 윤곽선, 외곽 윤곽선]



참고, 4번 이해 영상

profile
Data Science / Computer Vision
post-custom-banner

0개의 댓글