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