Computer Vision/opencv(python)

[50] 3) 템플릿 매칭(1): 이해하기

jwjwvison 2021. 3. 24. 10:37
  • 템플릿 매칭(Template matching)이란?
    • 입력 영상에서 (작은 크기의) 템플릿 영상과 일치하는 부분을 찾는 기법
    • 템플릿: 찾을 대상이 되는 작은 영상. 패치(patch)

 

  • 템플릿 매칭 함수
cv2.matchTemplate(image,templ,method,result=None,mask=None) -> result

 • image: 입력 영상 8 비트 또는 32 비트
 • templ : 템플릿 영상. image 보다 같거나 작은 크기 , 같은 타입
 • method: 비교 방법 . cv2.TM 으로 시작하는 플래그 지정

 • result: 비교 결과 행렬 . numpy.ndarray . dtype numpy.float32
           image 의 크기가 W x H 이고 , templ 의 크기가 w x h 이면 result 크기는 (W - w + 1) x (H - h +1)

 

  • 템플릿 매칭 방법

 

 

  • 템플릿 매칭 예제
'''
template matching 알고리즘은 크기변화 노이즈 밝기 변화에 강한 편이다(잘 된다)
다만 기본적으로 같은위치에 있는 픽셀끼리 곱하고 더해서 유사도를 판단하기 때문에
회전, 크기변환이 심하게 일어나면 내가 찾고자하는 템플릿 위치를 찾기가 힘들다
''' 

import sys
import numpy as np
import cv2


# 입력 영상 & 템플릿 영상 불러오기
src = cv2.imread('circuit.bmp', cv2.IMREAD_GRAYSCALE)
templ = cv2.imread('crystal.bmp', cv2.IMREAD_GRAYSCALE)

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

# 입력 영상 밝기 50증가, 가우시안 잡음(sigma=10)추가  (실험 용도)
noise=np.zeros(src.shape,np.int32)
cv2.randn(noise,50,10)                       #가우시안 형태의 랜덤넘버 제너레이션 하는 함수
src=cv2.add(src,noise,dtype=cv2.CV_8UC3)

# 템플릿 매칭 & 결과 분석
res=cv2.matchTemplate(src,templ,cv2.TM_CCOEFF_NORMED)
res_norm=cv2.normalize(res,None,0,255,cv2.NORM_MINMAX,cv2.CV_8U)   #grayscale 영상

_,maxv,_,maxloc=cv2.minMaxLoc(res)       #최대값과 최대값 위치 알려줌
# 내가 찾고자 하는 객체가 없는 사진에서도 어떻게든 이 프로그램은 찾아내기 때문에 
# maxv값을 통해 임계값을 주어서 찾았는지 없는지를 판단할수 있게 만들어 줘야 한다
print('maxv:',maxv)                  
print('maxloc:',maxloc)

# 매칭 결과를 빨간색 사각형으로 표시
th,tw=templ.shape[:2]
dst=cv2.cvtColor(src,cv2.COLOR_GRAY2BGR)
cv2.rectangle(dst,maxloc,(maxloc[0]+tw,maxloc[1]+th),(0,0,255),2)

# 결과 영상 화면 출력
cv2.imshow('res_norm', res_norm)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

탬플릿 매칭 예제 결과 영상