이번에는 외곽선 계층 구조를 사용하여 외곽선을 검출하고 그리는 예제 코드를 살펴보겠습니다. 코드 12-4에 나타난 contours_hier() 함수는 RETR_CCOMP 모드로 객체 외곽선을 검출하고, 외곽선 계층 구조 정보를 활용하여 외곽선을 그립니다. contours_hier() 함수가 정의된 소스 파일과 사용된 영상 파일은 내려받은 예제 파일 중 ch10/findcts 프로젝트에서 확인할 수 있습니다.
코드 12-4 계층 구조를 사용하는 외곽선 검출과 그리기 [ch10/findcts]
01 void contours_hier() 02 { 03 Mat src = imread("contours.bmp", IMREAD_GRAYSCALE); 04 05 if (src.empty()) { 06 cerr << "Image load failed!" << endl; 07 return; 08 } 09 10 vector<vector<Point> > contours; 11 vector<Vec4i> hierarchy; 12 findContours(src, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE); 13 14 Mat dst; 15 cvtColor(src, dst, COLOR_GRAY2BGR); 16 17 for (int idx = 0; idx >= 0; idx = hierarchy[idx][0]) { 18 Scalar c(rand() & 255, rand() & 255, rand() & 255); 19 drawContours(dst, contours, idx, c, -1, LINE_8, hierarchy); 20 } 21 22 imshow("src", src); 23 imshow("dst", dst); 24 25 waitKey(0); 26 destroyAllWindows(); 27 }
• 10~12행 findContours() 함수 호출 시 hierarchy 인자를 전달하여 계층 정보를 받아 옵니다.
• 17행 0번 외곽선부터 시작하여 계층 정보의 다음 외곽선으로 이동하면서 for 반복문을 수행합니다.
• 19행 drawContours() 함수에 hierarchy 정보를 전달하여 외곽선을 그리도록 합니다. 선의 두께를 -1로 지정하였으므로 외곽선 내부를 지정한 색깔로 채웁니다.