12.2.1 외곽선 검출
객체의 외곽선(contour)은 객체 영역 픽셀 중에서 배경 영역과 인접한 일련의 픽셀을 의미합니다. 보통 검은색 배경 안에 있는 흰색 객체 영역에서 가장 최외곽에 있는 픽셀을 찾아 외곽선으로 정의합니다. 만약 흰색 객체 영역 안에 검은색 배경 영역인 홀(hole)이 존재한다면 홀을 둘러싸고 있는 객체 픽셀들도 외곽선으로 검출할 수 있습니다. 즉, 객체의 외곽선은 객체 바깥쪽 외곽선과 안쪽 홀 외곽선으로 구분할 수 있습니다.
객체 하나의 외곽선은 여러 개의 점으로 구성됩니다. 그러므로 객체 하나의 외곽선 정보는 vector<Point> 타입으로 저장할 수 있습니다.1 또한 하나의 영상에는 여러 개의 객체가 존재할 수 있으므로 영상 하나에서 추출된 전체 객체의 외곽선 정보는 vector<vector<Point>> 타입으로 표현할 수 있습니다. 그러므로 OpenCV에서는 다음과 같은 형식의 변수를 선언하여 외곽선 검출 함수에 전달합니다.
vector<vector<Point>> contours;
외곽선 검출이 실제로 어떻게 동작하는지를 가늠하기 위해 작은 크기의 영상을 대상으로 외곽선 검출과 표현 방법에 대해 알아보겠습니다. 테스트로 사용할 8×8 크기의 이진 영상을 그림 12-6(a)에 나타냈습니다. 이 영상은 흰색으로 표현된 객체 영역이 세 개 있고, 홀은 없는 단순한 형태입니다. 이 영상에 대해 외곽선 검출을 수행하면 그림 12-6(b)에서 녹색으로 표현한 픽셀들이 외곽선 점들로 검출됩니다. 검출된 외곽선 점들의 좌표는 앞에서 선언한 contours 변수에 모두 저장됩니다. contours 변수에 저장된 좌표 정보를 분석하기 위해 편의상 그림 12-6(b) 각각의 외곽선에 0부터 시작하는 임의의 번호를 표시했습니다.
▲ 그림 12-6 외곽선 검출 결과 분석을 위한 테스트 영상
1 vector는 std::vector 클래스이고, Point는 cv::Point 클래스입니다.