흰색 객체를 분할하여 특징을 분석
객체 위치 및 크기 정보, ROI 추출, 모양 분석
레이블링 & 외곽선 검출
서로 연결되어 있는 객체 픽셀에 고유한 번호를 지정
영역 기반 모양 분석
레이블맵, 바운딩 박스, 픽셀 개수, 무게 중심 좌표를 반환
image : 입력 8비트 1채널 영상
labels : 출력 레이블링 결과 행렬
connectivity : 4 또는 8
4-이웃 연결 관계
8-이웃 연결 관계
ltype : 출력 영상 타입
return : 객체 개수 (배경 포함)
int connectedComponents(InputArray image,
OutputArray labels,
int connectivity = 8,
int ltype = CV_32S);
객체 정보를 함께 반환하는 레이블링 함수
image : 입력 8비트 1채널 영상
labels : 출력 레이블링 결과 행렬
stats : 출력 각 객체의 바운딩 박스
centroids : 출력 각 객체의 무게 중심 위치 정보를 담은 행렬
connectivity : 4 또는 8
ltype : 출력 영상 타입
return : 객체 개수 (배경 포함)
int connectedComponentWithStats(InputArray image,
OutputArray labels,
OutputArray stats,
OutputArray centroids,
int connectivity = 8,
int ltype = CV_32S);
label
라벨 개수와 라벨맵
바운딩 박스 정보
x, y, width, height
무게 중심
x, y
객체 1
(2+3+0+1+2+3+0+1+2+3)/10=1.7
(0+0+1+1+1+1+2+2+2+2)/10=1.2
keyseg
각 객체의 외곽선 좌표를 모두 검출
외곽선 기반 모양 분석
다양한 외곽선 처리 함수에서 활용 가능
외곽선 점 하나 : Point P;
객체 하나의 외곽선 : vector<Point> contour;
여러 객체의 외곽선 : vector<vector<Point>> contours;
image : 입력 대상
contours : 검출된 외곽선 정보
hierarchy : 외곽선 계층 정보
mode : 외곽선 검출 모드
RETR_EXTERNAL, RETR_LIST, RETR_CCOMP, RETR_TREE
method : 외곽선 근사화 방법
CHAIN_APPROX_NONE, CHAIN_APPROX_SIMPLE
offset : 좌표 값 이동
void findContours(InputOutputArray image,
OupputArrayOfArrays contours,
OutputArray hierarchy,
int mode,
int method,
Point offset = Point());
void findContours(InputOutputArray image,
OutputArrayOfArrays contours,
int mode,
int method,
Point offset = Point());
image : 입력 영상
contours : 외곽선 정보
contourIdx : 외곽선 인덱스
color : 외곽선 색상
thickness : 외곽선 두께
lineType : 선 종류
hierarchy : findContours() 함수에서 구한 외곽선 계층 정보
maxLevel : 그리기를 수행할 최대 외곽선 레벨
offset : 좌표 값 이동
void drawContours(InputOutputArray image,
InputArrayOfArrays contours,
int contourIdx,
const Scalar& color,
int thickness = 1,
int lineType = Line_8,
InputArray hierarchy = noArray(),
int maxLevel = INT_MAX,
Point offset = Point());
contours1
contours2
curve : 외곽선 좌표
closed : true면 폐곡선으로 간주
return : 외곽선 길이
double arcLength(InputArray curve, bool closed);
contour : 외곽선 좌표
oriented : true면 외곽선 진행 방향에 따라 부호있는 면적을 반환
return : 외곽선으로 구성된 영역의 면적
double contourArea(InputArray contour, bool oriented = false);
points : 외곽선 좌표
return : 외곽선을 외접하여 둘러싸는 가장 작은 직사각형
Rect boundingRect(InputArray points);
points : 외곽선 좌표
center : 출력 바운딩 서클 중심 좌표
radius : 출력 바운딩 서클 반지름
void minEnclosingCircle(InputArray points, Point2f& center, float& radius);
curve : 입력 곡선
approxCurve : 더글라스-포이커 알고리즘(Douglas-Peucker algorithm)으로 근사화된 외곽선
epsilon : 근사화 정밀도 조절
closed : true를 전달하면 폐곡선
void approxPolyDP(InputArray curve,
OutputArray approxCurve,
double epsilon,
bool closed);
contour : 입력 곡선 좌표
return : 컨벡스면 true 아니면 false
bool isContourConvex(InputArray contour);
정해진 외곽선 길이에 대한 넓이 비율이 가장 큰 형태가 원
도형의 넓이(A)와 외곽선 길이(P)의 비율을 검사
값이 1에 가까울수록 원으로 판단
polygon