OpenCV 이진 영상 처리 - (2)

Lily·2023년 10월 26일
0

TIL

목록 보기
14/21

객체 단위 분석

  • (흰색) 객체를 분할하여 특징을 분석
  • 객체 위치 및 크기 정보, ROI 추출, 모양 분석 등
  • 레이블링 & 외곽선 검출

레이블링

  • 서로 연결되어 있는 객체 픽셀에 고유한 번호를 지정 (레이블맵)
    • 동일 객체에 속한 모든 픽셀에 고유한 번호를 매기는 작업
    • 일반적으로 이진 영상에서 수행
    • OpenCV 3.x 버전부터 최신 논문 기반의 레이블링 함수 제공
    • Connected component labeling
  • 영역 기반 모양 분석
  • 픽셀의 연결 관계
    • 4-이웃 연결 관계 (4-neighbor connectivity)
    • 8-이웃 연결 관계 (8-neighbor connectivity)
  • 레이블맵, 바운딩 박스, 픽셀 개수, 무게 중심 좌표를 반환

레이블링 함수

int connectedComponents(InputArray image, OutputArray labels,
						int connectivity=8, int ltype=CV_32S);
  • image: (입력) 8비트 1채널 영상
  • labels: (출력) 레이블링 결과 행렬. 레이블맵. Mat 객체
  • connectivity: 4 또는 8
  • ltype: 출력 영상 타입. CV_32S(int) 또는 CV_16S(short)
  • 반환값: 객체 개수. N을 반환하면 0 ~ (N-1) 사이의 레이블이 존재하며, 0은 배경을 의미 (실제 객체 개수는 N-1)

객체 정보를 함께 반환하는 레이블링 함수

int connectedComponentsWithStats(InputArray image, OutputArray labels,
								OutputArray stats, OutputArray centroids,
								int connectivity=8, int ltype=CV_32S);
                                
// 사용 예시
Mat labels, stats, centroids;
int cnt = connectedComponentsWithStats(src, labels, stats, centroids);
  • image: (입력) 8비트 1채널 영상
  • labels: (출력) 레이블링 결과 행렬. 레이블맵. Mat 객체
  • stats: (출력) 각 객체의 바운딩 박스, 픽셀 개수 정보를 담은 행렬 (CV_32SC1, N x 5)
  • centroids: (출력) 각 객체의 무게 중심 위치 정보를 담은 행렬 (CV_64FC1, N x 2)
  • connectivity: 4 또는 8
  • ltype: 출력 영상 타입. CV_32S(int) 또는 CV_16S(short)
  • 반환값: 객체 개수. N을 반환하면 0 ~ (N-1) 사이의 레이블이 존재하며, 0은 배경을 의미 (실제 객체 개수는 N-1)

\\
\\

외곽선 검출 (contour tracing)

  • 객체의 외곽선 좌표를 모두 검출
  • 외곽선 기반 모양 분석
    • 바깥쪽 & 안쪽(홀) 외곽선: 외곽선의 계층 구조도 표현 가능
  • 다양한 외곽선 처리 함수에서 활용 가능 (근사화, 컨벡스헐 등)
  • 외곽선 좌표를 표현하려면?
    • 외곽선 점 하나: Point p;
    • 객체 하나의 외곽선: vector<Point> contour;
    • 여러 객체의 외곽선: vector<vector<Point>> contours;

외곽선 검출 함수

int findContours(InputArray image, OutputArray contours,
				 OutputArray hierarchy, int mode,
                 int method, Point offset=Point());
                 
int findContours(InputArray image, OutputArray contours,
				 int mode, int method, Point offset=Point());
  • image: 입력 영상. non-zero 픽셀을 객체로 간주함
  • contours: 검출된 외곽선 정보. vector<vector<Point>> 자료형
  • hierarchy: 외곽선 계층 정보. vector<Vec4i> 자료형
    • 네 개의 정수 값이 차례대로, next, prev, child, parent 외곽선 인덱스를 가리킴
    • 해당 외곽선이 없으면 -1 지정
  • mode: 외곽선 검출 모드, 다음 중 하나를 지정
    • RETR_EXTERNAL: 바깥쪽 외곽선만 검출 (내부 객체 외곽선도 제외)
    • RETR_LIST: 모든 외곽선을 1단계 계층으로 다 검출
    • RETR_CCOMP: 2단계 계층 정보를 가지고 다 검출
    • RETR_TREE: 모든 계층 정보 다 검출
  • method: 외곽선 근사화 방법, 다음 중 하나를 지정
    • CHAIN_APPROX_NONE: 근사화 없음, 즉 모든 외곽선 정보 다 저장, 대부분 이 옵션으로 사용
    • CHAIN_APPROX_SIMPLE: 수직선, 수평선, 대각선에 대해 끝점만 저장, 메모리를 절약 할 수 있음
  • offset: 좌표값 이동 옵셋

외곽선 그리기 함수

int drawContours(InputArray image, OutputArray contours,
				 int contourIdx, const Scalar& color, int thickness=1,
                 int lineType=LINE_8, InputArray hierarchy=noArray(),
                 int maxLevel=INT_MAX, Point offset=Point());
  • image: 입력 영상. non-zero 픽셀을 객체로 간주함
  • contours: 외곽선 정보. vector<vector<Point>> 자료형
  • contourIdx: 외곽선 인덱스,
    • contourIdx=-1 이면 모두 그림
  • color: 외곽선 색상
  • thickness: 외곽선 두께,
    • thickness < 0 이면 내부를 채움
  • lineType: 선 종류, LINE_4, LINE_8, LINE_AA 중 하나
  • hierarchy: findContours() 함수에서 구한 외곽선 계층 정보
    • 계층 정보를 사용하지 않으면 noArray() 또는 Mat() 지정
  • maxLevel: 그리기를 수행할 최대 외곽선 레벨
    • maxLevel=0 이면 contourIdx 외곽선만 그림
    • INT_MAX 이면 모든 외곽선을 그림
  • offset: 좌표 값 이동 옵셋

OpenCV 외곽선 관련 함수

function namedescription
arcLength()외곽선 길이를 반환
contourArea()외곽선이 감싸는 영역의 면적을 반환
boundingRect()주어진 점을 감싸는 최소 크기 사각형(bounding box) 반환
minEnclosingCircle()주어진 점을 감싸는 최소 크기 원을 반환
minAreaRect()주어진 점을 감싸는 최소 크기 회전된 사각형을 반환
minEnclosingTriangle()주어진 점을 감싸는 최소 크기 삼각형을 반환
approxPolyDP()외곽선을 근사화(단순화)
fitEllipse()주어진 점에 적합한 타원을 반환
fitLine()직선 모양일 경우, 주어진 점에 적합한 직선을 반환
isContourConvex()컨벡스인지를 검사
convexHull()주어진 점으로부터 컨벡스 헐을 반환
convexityDefects()주어진 점과 컨벡스 헐로부터 컨벡스 디펙트(볼록하게 만들기 위해 추가한 부분)를 반환

\\
\\

다각형 검출 프로그램

원 판별하기

  • 정해진 외곽선 길이에 대한 넓이 비율이 가장 큰 형태가 원
    • 도형의 넓이(A)와 외곽선 길이(P)의 비율을 검사
    • 1에 가까워질수록 원에 가깝고, 1보다 많이 작으면 원이 아님

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

삼각형, 사각형 판별하기

  • approxPolyDP() 함수를 통해 return을 받으면, 꼭지점을 확인해 주는데, 이 때 return=3 이면 삼각형, return=4 이면 사각형으로 도형을 판별할 수 있다.

\\
\\

References

  • 자율주행 데브코스 황선규 강사님
profile
First Attempt In Learning

0개의 댓글