윤곽선(Contour)이란?

객체의 경계를 따라 연속적으로 결합되는 픽셀들을 윤곽선이라고 할 수 있다. 윤곽선은 모양 분석과 물체 감지 및 인식에 유용하다.

윤곽선을 찾을때는 더 나은 검출 정확도를 위해 이진화된 이미지를 사용하며, 검정 배경에서 흰색 객체를 찾는 것임을 기억하자.

윤곽선 알고리즘

윤곽선을 찾는 알고리즘이나 관련논문은 다음과 같다.

Sqaure tracing 알고리즘

간단하면서 효과적인 Sqaure tracing 알고리즘에 대해서만 알아보자. 이 알고리즘의 동작은 현재 기준 픽셀이 흰색(객체)인지 검정색(배경)인지만 따진다. 먼저 이미지를 픽셀별로 하나씩 순회한다.  만약 순회중 흰색픽셀이 발견되면, 객체의 윤곽선 일부를 발견한 것이므로 이를 따라 윤곽선 탐색을 시작하게 된다. 윤곽선 탐색은 두가지만 기억하면 된다.

  • 현재 찾은 픽셀이 흰색이라면 로 꺾어 진입한다.
  • 현재 찾은 픽셀이 검정색이라면 로 꺾어 진입한다.

탐색하면서 발견한 흰색픽셀들이 객체의 윤곽선이며, 처음 진입한 픽셀을 발견하면 탐색을 종료한다. 

이 점을 기억하고 다음의 gif 이미지를 살펴보자. 

Square tracing 알고리즘 코드가 궁금하다면 Wiki를 참조하자.

윤곽선 검출 함수

OpenCV에서 제공하는 기본적인 윤곽선 검출 함수는 findContours가 있다.

findContours(
    Mat image, List<MatOfPoint> contours, 
    Mat hierarchy, int mode, int method
)
image : 입력영상, 0이 아닌 픽셀을 객체로 간주함.
mode : 윤곽선 검출 모드
method : 윤곽선 근사화 방법
contours : 검출된 윤곽선 좌표
hierachy : 윤곽선 계층정보
offset : 좌표 값 이동 오프셋, 기본값 (0,0)

윤곽선 검출 모드

윤곽선 검출 모드는 다음과 같다.

  • RETR_EXTERNAL : 객체의 바깥 윤곽선만 검출한다.  계층정보 X
  • RETR_LIST : 모든 윤곽선을 계층정보 없이 가져온다.
  • RETR_CCOMP : 모든 윤곽선을 검색하여 2단계 계층 구조로 구성한다. 그렇기 때문에 객체내에 구멍이 뚫려 있고 이 구멍안에 다시 객체가 존재하는 경우 이 객체를 최상위 객체로 간주한다.
  • RETR_TREE : 모든 윤곽선과 윤곽선내에 포함된 또 다른 윤곽선의 전체 계층정보를 재구성한다.

윤곽선 근사화 방법

다음의 윤곽선 근사화 알고리즘을 선택할 수 있다.

윤곽선 그리기

OpenCV에서는 친절하게도 검출한 윤곽선 정보를 통해 바로 윤곽선 그리기를 할 수 있는 함수를 제공하고 있다.

drawContours(
    Mat image, 
    List<MatOfPoint> contours, 
    int contourIdx, 
    Scalar color, 
    int thickness, 
    int lineType, 
    Mat hierarchy, 
    int maxLevel, 
    Point offset
)
image : 입력 및 출력 영상
contours : 윤곽선 좌표 정보
contourIdx : 윤곽선 인덱스
color : 윤곽선 색상
thickness : 윤곽선 두께, 0보다 작은 숫자 입력시 면을 채운다.
lineType : 라인 타입 (LINE_4, LINE_8, LINE_AA)
hierarchy : 윤곽선 계층 정보
maxLevel : 그리기를 수행할 최대 윤곽선 레벨. 0이면 contourIdx로 지정된 외곽선만 그림.

윤곽선 그리기 예제

소스코드는 github에서 확인

 

 

카테고리: OpenCV

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.