본문 바로가기
OpenCV/OpenCV-Chapter

CH08 OpenCV-Python Moment 기반 객체 검출

by kiimy 2021. 12. 24.
728x90

모멘트(Moments)란?

• 영상의 형태를 표현하는 일련의 실수값

• 특정 함수 집합과의 상관 관계(correlation) 형태로 계산

객체 위치가 바뀌어도 동일한 값의 특징 벡터를 추출

- Geometric moments 성능이 안 좋아

==> Legendre moments, Zernike moments, ART(Angular Radial Transform)이 성능이 좋다

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

• 3차 이하의 정규화된 중심 모멘트를 조합하여 만든 7개의 모멘트 값

영상의 크기, 회전, 이동, 대칭 변환(Affine Transform)에 불변

객체와 객체 비교할 때(모양) 원하는 객체 검출 가능
# obj = spade만 골라내는 것이 목적
obj = cv2.imread('ch08\\images\\spades.png', cv2.IMREAD_GRAYSCALE)
src = cv2.imread('ch08\\images\\symbols.png', cv2.IMREAD_GRAYSCALE)

if src is None or obj is None:
    print('Image load failed!')
    sys.exit()

# 객체 영상 외곽선 검출
# 객체가 검은색이라 흰색으로 INV
_, 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]
print(obj_contours) # int32 
# 입력 영상 분석
_, src_bin = cv2.threshold(src, 128, 255, cv2.THRESH_BINARY_INV)
src_contours, _ = cv2.findContours(src_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 결과 영상(bbox 색 보여주기위함)
dst = cv2.cvtColor(src, cv2.COLOR_GRAY2BGR)

# 입력 영상의 모든 객체 영역에 대해서
# contours= 각 점들의 집합
# pts= 객체 하나의 외곽선
for pts in src_contours:
    # noise를 제거하기 위함(spade 밖에 없기 때문에 굳이 사용은 안해도되)
    if cv2.contourArea(pts) < 1000:
        continue

    rc = cv2.boundingRect(pts)
    print(rc[0], rc[1]) # x, y
    cv2.rectangle(dst, rc, (0,0,255), 1)

    # 모양 비교
    # dist = 두 객체 상당히 비슷하다 작은값, 차이가 크다(큰값) = distance
    dist = cv2.matchShapes(obj_pts, pts, cv2.CONTOURS_MATCH_I3, 0)
    '''
    cv2.matchShapes(contour1, contour2, method, parameter) -> retval
    
    contour1: 첫 번째 외곽선 또는 그레이스케일 영상
    contour2: 두 번째 외곽선 또는 그레이스케일 영상
    투시변환 or 찌그러진 이미지에서는 성능이 떨어진다.
    '''
    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:
        cv2.rectangle(dst, rc, (0,0,255), 2)

cv2.imshow('obj', obj)
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

method

마지막을 주로 사용
객체 / 해당 객체 검출

 

728x90

댓글