OpenCV 비전 실무12장 · Contour Detection 과 객체 분석3 / 21← 이전목차다음 →MetaContents

12장. Contour Detection 과 객체 분석

윤곽선이란

색칠 공부 책의 그림은 검은 테두리 선으로 되어 있습니다. 아이는 테두리 하나를 손가락으로 한 바퀴 따라가며 "이건 사과 하나"라고 압니다. 그런데 같은 그림을 점묘화처럼 검은 점만 흩뿌려 그려 놓으면, 어느 점이 사과의 것이고 어느 점이 옆 귤의 것인지 따로 알기 어렵습니다. 윤곽선은 물체마다 테두리를 한 바퀴 따라가며 이은 선이고, 경계는 흩뿌린 검은 점에 가깝습니다.

경계는 밝기가 바뀌는 칸의 모음이고 윤곽선은 테두리를 따라 이은 점 목록이라는 비교 그림

초록 상자의 경계는 10장, 11장에서 만든 것으로, 밝기가 바뀌는 칸에 255 를 적은 그림입니다. 칸마다 "여기가 경계다"라는 표시만 있고, 그 칸이 어느 물체의 것인지는 적혀 있지 않습니다. 다홍 상자의 윤곽선은 물체 하나의 테두리를 따라 이은 점 목록이라 목록 하나가 곧 물체 하나입니다. 여기서 흩뿌린 검은 점이 경계이고, 손가락으로 한 바퀴 따라간 테두리가 윤곽선입니다.

이진 그림, 같은 그림의 Canny 경계, 물체마다 다른 색으로 그린 윤곽선을 나란히 놓은 그림

같은 도형 판으로 둘을 견주었습니다. 가운데 Canny 경계는 모든 테두리가 똑같은 검은 칸이라 몇 개의 물체인지 그림만으로는 셀 수 없습니다. 오른쪽 윤곽선은 물체마다 따로 묶여 있어 색을 하나씩 다르게 칠할 수 있고, 목록의 길이로 개수를 바로 압니다. 도넛은 바깥 테두리만 그렸는데, 구멍의 테두리를 어떻게 다루는지는 "찾는 방식과 계층 구조" 절에서 봅니다.

경계와 윤곽선 견주기

견줄 것경계(10·11차시)윤곽선(12차시)
생김새0 과 255 의 그림 한 장점 좌표 배열의 목록
물체 구별하지 않는다목록 하나가 물체 하나
입력흑백 사진이진 그림(흰 물체, 검은 바탕)
끊긴 곳그대로 끊겨 있다흰 덩어리를 따라가므로 늘 닫혀 있다
할 수 있는 일테두리 보기, 다음 단계의 재료개수, 면적, 둘레, 위치, 상자

짧은 예시

Python
import cv2

# 가상의 도형 판(흰 도형, 검은 바탕)을 흑백으로 읽는다
shapes = cv2.imread("ch12_shapes.png", cv2.IMREAD_GRAYSCALE)

# 경계: 칸의 모음이라 칸 수만 셀 수 있다
edges = cv2.Canny(shapes, 50, 150)
print("경계 칸 수:", int((edges > 0).sum()))

# 윤곽선: 물체마다 점 목록 하나. 목록의 길이가 곧 덩어리 수다
contours, hierarchy = cv2.findContours(shapes, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print("윤곽선 수:", len(contours))

교안 PC 에서는 경계 칸이 1,580개, 윤곽선이 8개입니다. 도형 6개와 작은 점 2개가 따로 잡혔습니다. 경계 칸 수로는 물체가 몇 개인지 알 수 없지만, 윤곽선의 수는 바로 흰 덩어리의 수입니다.

주의할 점

  • 윤곽선은 흰 덩어리의 테두리입니다. 물체가 어둡고 바탕이 밝은 사진이면 이진화할 때 뒤집어(8장의 THRESH_BINARY_INV) 물체를 흰색으로 만든 뒤 찾습니다.
  • 맞닿은 두 물체는 흰 덩어리 하나라 윤곽선도 하나입니다. 떼어 놓으려면 9장의 열기나 침식으로 먼저 떼어 냅니다.
← 이전 절12장 · 용어 짚고 가기다음 절 →12장 · cv2.findContours 의 입력과 결과