더북(TheBook)

이번에는 외곽선 계층 구조를 사용하여 외곽선을 검출하고 그리는 예제 코드를 살펴보겠습니다. 코드 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로 지정하였으므로 외곽선 내부를 지정한 색깔로 채웁니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.