어제보다 나은 내가 되자
레이블링, connectedComponents와 connectedComponentsWithStats 본문
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
Mat src = imread("keyboard.bmp", IMREAD_GRAYSCALE);
Mat bin;
threshold(src, bin, 0, 255, THRESH_BINARY | THRESH_OTSU);
Mat labels, stats, centroids;
int cnt = connectedComponentsWithStats(bin, labels, stats, centroids);
Mat dst;
cvtColor(src, dst, COLOR_GRAY2BGR);
for (int i = 1; i < cnt; i++) {
// object check
// i = 0 is background
int* p = stats.ptr<int>(i);
if (p[4] < 20) continue; // p[4] is area
rectangle(dst, Rect(p[0], p[1], p[2], p[3]), Scalar(0, 255, 255), 2);
}
imshow("src", src);
imshow("dst", dst);
waitKey();
return 0;
}
영상내의 객체에 고유 번호를 매기는 작업을 레이블링이라고 한다.
컬러영상에서는 당연히 어렵겠지만 그레이스케일영상에서 레이블링을 적용하기 힘든 이유는 회색영역조차 객체로 인식되기 때문이다. 정확히 레이블링을 하기 위해서는 0과 1로 나뉜, 이진화된 영상을 이용하는 것이 좋다.
threshold를 통해 이진화를 적용하고 레이블 맵과 객체 영역의 통계 정보를 한꺼번에 반환하는 connectedComponentsWithStats 함수를 이용한다.
labels는 레이블 맵 행렬로 배경은 0, 1~ 레이블에 번호를 매긴다.
stats는 각 레이블 영역의 통계 정보를 담은 행렬이다. 행은 레이블 개수, 열은 5로 고정이다.
각 열은 차례대로 x좌표, y좌표, 가로, 세로, 면적 을 나타낸다.
각 행은 차례대로 객체 정보를 나타낸다.
centroids는 각 레이블 영역의 중심좌표를 담은 행렬이다. 행은 레이블 개수, 열은 2로 고정이다.
각 열은 차례대로 무게 중심의 x좌표, 무게 중심의 y좌표이다.
각 행은 차례대로 객체 정보를 나타낸다.
'영상처리' 카테고리의 다른 글
모든 픽셀을 방문하여 밝기 변화하기 (0) | 2020.05.13 |
---|---|
그레이 스케일 영상 확인 (0) | 2020.05.13 |
적응형 이진화, adaptivethreshold (0) | 2020.05.13 |
이진화, threshold (0) | 2020.05.13 |
히스토그램 역투영을 통한 피부색 영역 검출, calcBackProject (0) | 2020.05.13 |
Comments