더북(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행 검출된 객체를 감싸는 바운딩 박스를 노란색으로 그립니다.