contours 변수는 vector<vector<Point>> 타입이며, 이는 vector<Point> 타입을 여러 개 포함할 수 있는 타입입니다. 그림 12-6에서는 외곽선 객체가 세 개 있으므로 contours 변수에는 vector<Point> 타입의 데이터가 세 개 저장됩니다. contours 변수에 저장된 각각의 외곽선은 contours[0], contours[1], contours[2] 형태로 접근할 수 있습니다. 여기서 contours[0], contours[1], contours[2]는 모두 vector<Point> 타입이고, 각각 인덱스에 해당하는 외곽선 점들의 좌표를 저장하고 있습니다. 그림 12-6과 같이 외곽선이 검출된 경우, contours[0], contours[1], contours[2]에 저장된 외곽선 점 좌표는 다음과 같습니다.2
contours[0] : [1, 1], [1, 2], [1, 3], [2, 4], [3, 3], [3, 2], [3, 1], [2, 1] contours[1] : [6, 1] contours[2] : [5, 4], [4, 5], [4, 6], [5, 6], [6, 6], [6, 5], [6, 4]
contours 변수로부터 전체 객체 개수를 알고 싶다면 contours.size() 반환값을 확인하면 되며, 그림 12-6의 예에서 contours.size()는 3입니다. 만약 0번 외곽선의 점 개수를 알고 싶다면 contours[0].size() 형태로 코드를 작성할 수 있으며, 그림 12-6의 예에서 contours[0].size()는 8을 반환합니다.
2 실제로 OpenCV 함수를 이용하여 외곽선을 검출할 경우, 외곽선 번호는 그림 12-6(b)와는 다른 순서로 매겨집니다. 여기서는 설명의 편의를 위해 번호를 임의로 지정하였습니다.