[ch08] 영상 분할과 객체 검출 - 모멘트 기반 객체 검출

빨주노·2021년 8월 30일
0

모멘트(Moments)란?

  • 영상의 형태를 표현하는 일련의 실수값
  • 특정 함수 집합과의 상관관계(correlation) 형태로 계산
    • ex) Geometric moments :
  • Geometric moments, Central moments, Normalized central moments, Legendre moments, Complex moments, Zernike moments, ART(Angular Radial Transform), etc

Hu의 7개 불변 모멘트(Hu's seven invariant moments)

  • 3차 이하의 정규화된 중심 모멘트를 조합하여 만든 7개의 모멘트 값
  • 영상의 크기, 회전, 이동, 대칭 변환에 불변

모양 비교 함수

cv2.matchShapes(contour1, contour2, method, parameter) -> retval
  • contour1 : 첫 번째 외곽선 또는 그레이스케일 영상
  • contour2 : 두 번째 외곽선 또는 그레이스케일 영상
  • method : 비교 방법 지정.
    cv2.CONTOURs_MATCH_l1, cv2.CONTOURs_MATCH_l2, cv2.CONTOURs_MATCH_l3 중 하나 사용

    • cv2.CONTOURs_MATCH_l3가 제일 좋은 방법이다.
  • parameter : 사용되지 않음. 0 지정.
  • retval : 두 외곽선 또는 그레이스케일 영상 사이의 거리(distance)
  • 참고사항
    • Hu의 불변 모멘트를 이용하여 두 외곽선 또는 영상의 모양을 비교 → 크기, 회전, 이동, 대칭 변환에 강인

모멘트 기반 객체 검출 예제

obj = cv2.imread('spades.png', cv2.IMREAD_GRAYSCALE)
src = cv2.imread('symbols.png', cv2.IMREAD_GRAYSCALE)

# 객체 영상 외곽선 검출
_, obj_bin = cv2.threshold(obj, 128, 255, cv2.THRESH_BINARY_INV)
obj_contours, _ = cv2.findContours(obj_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
obj_pts = obj_contours[0]

# 입력 영상 분석
_, src_bin = cv2.threshold(src, 128, 255, cv2.THRESH_BINARY_INV)
contours, _ = cv2.findContours(src_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 결과 영상
dst = cv2.cvtColor(src, cv2.COLOR_GRAY2BGR)

# 입력 영상의 모든 객체 영역에 대해서
for pts in contours:
    if cv2.contourArea(pts) < 1000:
        continue

    rc = cv2.boundingRect(pts)
    cv2.rectangle(dst, rc, (255, 0, 0), 1)

    # 모양 비교
    dist = cv2.matchShapes(obj_pts, pts, cv2.CONTOURS_MATCH_I3, 0) # dist 값으로 유사도 측정

    cv2.putText(dst, str(round(dist, 4)), (rc[0], rc[1] - 3),
                cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 0, 0), 1, cv2.LINE_AA)

    if dist < 0.1: # dist 값이 작을수록 obj와 유사하다.
        cv2.rectangle(dst, rc, (0, 0, 255), 2)

dist 값이 낮은 객체들이 스페이드로 검출되었다.

profile
딥 하게 딥러닝 하는중

0개의 댓글