레이블링과 외곽선 검출

BERT·2023년 4월 28일
0

Computer Vision

목록 보기
40/56

객체 단위 분석

흰색 객체를 분할하여 특징을 분석
객체 위치 및 크기 정보, 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);

Bounding box 구하기

points : 외곽선 좌표
return : 외곽선을 외접하여 둘러싸는 가장 작은 직사각형

Rect boundingRect(InputArray points);

Bounding circle 구하기

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)의 비율을 검사
4πAP2\displaystyle4\pi\frac{A}{P^2}값이 1에 가까울수록 원으로 판단

AP=πr22πrAP2=14π4πAP2=1\displaystyle\frac{A}{P}=\frac{\pi r^2}{2\pi r}\rarr\displaystyle\frac{A}{P^2}=\frac{1}{4\pi}\rarr4\pi\frac{A}{P^2}=1

polygon

0개의 댓글