컨투어(contour) 란, 윤곽이라는 뜻이다. OpenCV 에서 영상이나 이미지의 외곽 혹은 내곽을 검출해낼 수 있다. findContours 함수를 통해 이진화 이미지에서 윤곽선을 찾아낸다.
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)
contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
대표적으로 바이너리 이미지, 컨투어 Retrieval 모드 (4), Approximation Method(3) 를 파라미터로 입력 후 컨투어를 찾는다.
반환값으로 윤곽선과 계층구조를 반환한다.
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의 두께로 윤곽선을 그린다.
윤곽선에 포인터를 지정하는 방식을 의미한다.
cv.CHAIN_APPROX_NONE
모든 경계선에 포인터를 그린다.
cv.CHAIN_APPROX_SIMPLE
시작점과 끝점에만 포인터를 그린다.
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)
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로 하여 원의 내부를 채움)
CHAIN_APPROX_NONE
CHAIN_APPROX_SIMPLE
컨투어의 결과를 어떤 식으로 리턴 할지에 대한 4가지 방식
[Next, Previous, First_Child, Parent]
컨투어의 좌표는 위와 같은 형태로 저장된다.
모든 윤곽선을 검출, 계층구조를 모두 형성
모든 윤곽선을 검출, 계층구조는 구성하지 않음
외곽 윤곽선만 검출, 계층구조는 구성하지 않음
모든 윤곽선을 검출, 계층구조는 2단계로 구성
계층 구조를 통해 외곽, 내곽 윤곽선, 같은 계층 구조를 구별할 수 있다.
이 정보들이 hierarchy 에 담겨있으며
[Next, Previous, First_Child, Parent]
형태로 결과를 반환한다.
[다음 윤곽선, 이전 윤곽선, 내곽 윤곽선, 외곽 윤곽선]