본문 바로가기
IT/영상 처리

[Python_OpenCV] Templete Matching(템플릿 매칭)

by 빨강자몽 2018. 7. 22.

매칭이란 작은 템플릿 이미지가 전체 이미지를 돌면서 가장 유사한 부분을 찾는 것을 말한다.


- 템플릿 이미지



- 전체 이미지


 

- 코드 


import numpy as np
import cv2

img = cv2.imread("ori.jpg")
imgray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
w, h = imgray.shape[:2]
templ = cv2.imread("templ.jpg", cv2.IMREAD_GRAYSCALE)
templ_h, templ_w = templ.shape[:2]
res = cv2.matchTemplate(imgray, templ, cv2.TM_CCOEFF_NORMED)
loc = np.where(res >= 0.5)
for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv2.imshow("res",img)
cv2.waitKey(0)


- 코드 분석


res = cv2.matchTemplate(imgray, templ, cv2.TM_CCOEFF_NORMED)

- cv2.TM_CCOEFF_NORMED : 유사도를 구하는 방식을 정한다. (여러 방식이 있지만 이 방법이 좋은듯 하다.) -> 0 ~ 1


loc = np.where(res >= 0.5)

- 유사도가 0.5이상인 부분만 남긴다.


for pt in zip(*loc[::-1]):

    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)

- 유사도가 0.5이상인 부분을 빨간색 사각형으로 표시한다.


- 사용 하고 느낀점


템플릿 매칭할때 템플릿은 최소한의 특성만 가지는 사진이여야 한다.

하지만 이 때문에 너무 적은 특징을 가진다면 여러 사각형을 그리게 되는 문제가 발생한다.

-> 즉, 적절한 템플릿과, 유사도(0.5)를 설정해야한다.