Python OpenCV Contour

Woohojin·2022년 10월 20일

OpenCV

목록 보기
7/7

참조링크

Contour

컨투어(contour)는 등고선을 의미합니다. 등고선은 지형의 높이가 같은 영역을 하나의 선으로 표시한 것입니다. 영상에서 컨투어를 그리면 모양을 쉽게 인식할 수 있습니다.

FindCountour

src: 입력 영상, 검정과 흰색으로 구성된 바이너리 이미지

mode: 컨투어 제공 방식 설명은 밑에

method: 근사 값 방식 설명은 밑에

contours(optional): 검출한 컨투어 좌표 (list type)

hierarchy(optional): 컨투어 계층 정보 (Next, Prev, FirstChild, Parent, -1 [해당 없음])

offset(optional): ROI 등으로 인해 이동한 컨투어 좌표의 오프셋

dst, contours, hierarchy = cv2.findContours(src, mode, method, contours, hierarchy, offset)

Mode

cv2.RETR_EXTERNAL: 가장 바깥쪽 라인만 생성

cv2.RETR_LIST: 모든 라인을 계층 없이 생성

cv2.RET_CCOMP: 모든 라인을 2 계층으로 생성

cv2.RETR_TREE: 모든 라인의 모든 계층 정보를 트리 구조로 생성)

Method

cv2.CHAIN_APPROX_NONE: 근사 없이 모든 좌표 제공

cv2.CHAIN_APPROX_SIMPLE: 컨투어 꼭짓점 좌표만 제공

cv2.CHAIN_APPROX_TC89_L1: Teh-Chin 알고리즘으로 좌표 개수 축소

cv2.CHAIN_APPROX_TC89_KCOS: Teh-Chin 알고리즘으로 좌표 개수 축소


drawContour

img: 입력 영상

contours: 그림 그릴 컨투어 배열 (cv2.findContours() 함수의 반환 결과를 전달해주면 됨)

contourIdx: 그림 그릴 컨투어 인덱스, -1: 모든 컨투어 표시

color: 색상 값

thickness: 선 두께, 0: 채우기

cv2.drawContours(img, contours, contourIdx, color, thickness)

컨투어 단순화

지금까지 살펴본 컨투어 함수는 이미지 외곽을 따라 그림을 그려주는 기능을 제공했습니다. 하지만 실생활에서 얻는 대부분의 이미지는 약간의 노이즈가 포함되어 있습니다. 그래서 컨투어를 너무 정확히 그리는 것도 바람직하지 않습니다. 오히려 약간 단순화해 그리는 게 정확하게 그리는 것보다 더 쓸모 있는 경우가 있습니다.

contour: 대상 컨투어 좌표

epsilon: 근사 값 정확도, 오차 범위

closed: 컨투어의 닫힘 여부

approx: 근사 계산한 컨투어 좌표

approx = cv2.approxPolyDP(contour, epsilon, closed)

컨투어를 단순화하는 또 다른 형태는 볼록 선체(convex hull)를 만드는 것입니다. 볼록 선체란 어느 한 부분도 오목하지 않은 도형을 의미합니다. 따라서 볼록 선체는 대상을 완전히 포함하는 외곽 영역을 찾는데 유용합니다.

points: 입력 컨투어

hull(optional): 볼록 선체 결과

clockwise(optional): 방향 지정 (True: 시계 방향)

returnPoints(optional): 결과 좌표 형식 선택 (True: 볼록 선체 좌표 변환, False: 입력 컨투어 중에 볼록 선체에 해당하는 인덱스 반환)

hull = cv2.convexHull(points, hull, clockwise, returnPoints): 볼록 선체 계산

retval: True인 경우 볼록 선체임

retval = cv2.isContourConvex(contour): 볼록 선체 만족 여부 확인

contour: 입력 컨투어

convexhull: 볼록 선체에 해당하는 컨투어의 인덱스

defects: 볼록 선체 결함이 있는 컨투어의 배열 인덱스, N x 1 x 4 배열, [starts, end, farthest, distance]

start: 오목한 각이 시작되는 컨투어의 인덱스

end: 오목한 각이 끝나는 컨투어의 인덱스

farthest: 볼록 선체에서 가장 먼 오목한 지점의 컨투어 인덱스

distance: farthest와 볼록 선체와의 거리

defects = cv2.convexityDefects(contour, convexhull): 볼록 선체 결함 찾기

컨투어와 도형 매칭

서로 다른 물체의 컨투어를 비교하면 두 물체가 얼마나 비슷한지 알 수 있습니다. 이는 아래 함수로 간단히 구현할 수 있습니다.

contour1, contour2: 비교할 두 개의 컨투어

method: 휴 모멘트 비교 알고리즘 선택 플래그 (cv2.CONTOURS_MATCH_I1, cv2.CONTOURS_MATCH_I2, cv2.CONTOURS_MATCH_I3)

parameter: 알고리즘에 전달을 위한 예비 인수로 0으로 고정

retval: 두 도형의 닮은 정도 (0=동일, 숫자가 클수록 다름)

retval = cv2.matchShapes(contour1, contour2, method, parameter): 두 개의 컨투어로 도형 매칭

profile
인생을 컴퓨터와 함께

0개의 댓글