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