AI 그게 뭔데
끄적끄적 개발일지
AI 그게 뭔데
전체 방문자
오늘
어제
  • 분류 전체보기 (342)
    • 논문 (5)
    • DL(Deep-Learning) (34)
      • 개념 (14)
      • Python 기초 (14)
      • Tensorflow (6)
      • Pytorch (0)
    • NLP (10)
    • OpenCV (53)
    • DevOps (10)
      • AWS (2)
      • Docker & Kubernetes (4)
      • Spark (3)
      • SQL (1)
    • MacOS (1)
    • React-Native (2)
    • BI (3)
      • GA(Google Analytics) (3)
      • Tableau (0)
    • 알고리즘 (221)
      • 백준 (76)
      • 프로그래머스 (108)
      • 기타 알고리즘 (37)

인기 글

태그

  • OpenCV
  • 프로그래머스
  • 이코테
  • level1
  • 알고리즘
  • LEVEL2
  • 연습문제
  • 백준
  • Python
  • 파이썬

최근 글

hELLO · Designed By 정상우.
AI 그게 뭔데

끄적끄적 개발일지

[OpenCV with Python] 영상 분할과 객체 검출 : 모멘트 기반 객체 검출
OpenCV

[OpenCV with Python] 영상 분할과 객체 검출 : 모멘트 기반 객체 검출

2022. 2. 4. 22:20

모멘트(Moments)란?

    • 영상의 형태를 표현하는 일련의 실수값
    • 기본적으로 회전, 크기 변환, 대칭, 이동에 강력하며 객체에 변형이 생긴 경우에는 성능이 떨어진다.
    • 특정 함수 집합과의 상관관계(correlation) 형태로 계산
      • ex) Geometric moments :
        -  f(x,y) : 입력영상
        -  $x^{p}, y^{q}$ : 정의되어 있는 다항식 함수
        ➜  이 두개를 correlation 계산을 해서 실수값 m을 계산
      • x와 y 함수를 어떻게 정의하냐에 따라 모멘트를 여러가지 형태로 정의할 수 있다.

 

OpenCV에서는 Geomertic moments, Central moments, Normalized central moments 3가지 기능을 제공한다.

  •  Geometric moments 는 위의 식 대로 계산한 것이다.
  •  Central moments는 Geometric moments를 약간 변경해서 객체의 위치가 변경되어도 동일한 값의 특징 벡터를 추출하는 방법이다.
  •  Normalized central moments는 Central moments를 정규화한 것이다.

 

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

  • 3차 이하의 Normalized central moments의 수식을 조합해서 만든 7개의 모멘트 값
  • 영상의 크기, 회전, 이동, 대칭 변환에 불변
  • 객체와 객체의 모양을 비교할 때 이 방법을 이용하면 원하는 객체를 찾을 수 있음

 

✔︎  모양 비교 함수 - cv2.matchShapes

retval = cv2.matchShapes(contour1, contour2, method, parameter)
  • contour1 : 첫 번째 외곽선 또는 그레이스케일 영상
  • contour2 : 두 번째 외곽선 또는 그레이스케일 영상
  • method : 비교 방법 지정.
    cv2.CONTOURs_MATCH_l1, cv2.CONTOURs_MATCH_l2, cv2.CONTOURs_MATCH_l3 중 하나 사용
  • parameter : 사용되지 않음. 0 지정.
  • retval : 두 외곽선 또는 그레이스케일 영상 사이의 거리(distance)
    ➜  반환 값은 어떤 두 객체가 비슷하다고 판단하면 작은 값, 다르다고 판단하면 큰 값을 반환합니다.
  • 참고사항
    • Hu의 불변 모멘트를 이용하여 두 외곽선 또는 영상의 모양을 비교 → 크기, 회전, 이동, 대칭 변환에 강인

 

# Method

3번째 방법이 정규화를 이용하므로 효과가 가장 좋다고 알려져 있고, 3번을 주로 사용한다.

$m_{i}$는 1부터 7까지의 휴 모멘트 값을 의미한다.

a, b는 a객체, b객체를 의미한다.

 

 

 

 

 

💬  모멘트 기반 객체 검출 예제

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)

 

'OpenCV' 카테고리의 다른 글

[OpenCV with Python] 영상 분할과 객체 검출 : 템플릿 매칭2 - 인쇄체 숫자 인식  (0) 2022.02.04
[OpenCV with Python] 영상 분할과 객체 검출 : 템플릿 매칭 1  (0) 2022.02.04
[OpenCV with Python] 영상 분할과 객체 검출 : 그랩컷 - cv2.grabCut  (0) 2022.02.04
[OpenCV with Python] 이진 영상 처리 : 다양한 외곽선 함수  (0) 2022.02.04
[OpenCV with Python] 이진 영상 처리 : 외곽선 검출  (0) 2022.02.04
    AI 그게 뭔데
    AI 그게 뭔데
    공부와 개발 그리고 AI가 약간 첨가된 흔적 남기기

    티스토리툴바