더북(TheBook)

코드 12-2 레이블링을 이용하여 객체의 바운딩 박스 그리기 [ch10/labeling]

01    void labeling_stats()
02    {
03        Mat src = imread("keyboard.bmp", IMREAD_GRAYSCALE);
04     
05        if (src.empty()) {
06            cerr << "Image load failed!" << endl;
07            return;
08        }
09     
10        Mat bin;
11        threshold(src, bin, 0, 255, THRESH_BINARY | THRESH_OTSU);
12     
13        Mat labels, stats, centroids;
14        int cnt = connectedComponentsWithStats(bin, labels, stats, centroids);
15     
16        Mat dst;
17        cvtColor(src, dst, COLOR_GRAY2BGR);
18     
19        for (int i = 1; i < cnt; i++) {
20            int* p = stats.ptr<int>(i);
21    
22            if (p[4] < 20) continue;
23     
24            rectangle(dst, Rect(p[0], p[1], p[2], p[3]), Scalar(0, 255, 255), 2);
25        }
26     
27     
28        imshow("src", src);
29        imshow("dst", dst);
30     
31        waitKey();
32        destroyAllWindows();
33    }

 

3행 keyboard.bmp 영상을 그레이스케일 형식으로 불러와 src에 저장합니다.

10~11행 src 영상을 오츠 알고리즘으로 이진화하여 bin에 저장합니다.

13~14행 bin 영상에 대해 레이블링을 수행하고 각 객체 영역의 통계 정보를 추출합니다.

16~17행 src 영상을 3채널 컬러 영상 형식으로 변환하여 dst에 저장합니다.

19행 배경 영역을 제외하고 흰색 객체 영역에 대해서만 for 반복문을 수행합니다.

22행 객체의 픽셀 개수가 20보다 작으면 잡음이라고 간주하고 무시합니다.

24행 검출된 객체를 감싸는 바운딩 박스를 노란색으로 그립니다.

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