Python OpenCV 강좌 : 제 37강 - 템플릿 매칭

Python OpenCV Template Matching

Python OpenCV 강좌 : 제 37강 - 템플릿 매칭
[ Python-OpenCV ] - 윤대희

템플릿 매칭(Template Matching)


1 2 템플릿 매칭원본 이미지에서 템플릿 이미지와 일치하는 영역을 찾는 알고리즘입니다.

원본 이미지 위에 템플릿 이미지를 놓고 조금씩 이동해가며 이미지 끝에 도달할 때 까지 비교해 찾아갑니다.

이 방식을 통해, 템플릿 이미지와 동일하거나, 가장 유사한 영역을 원본 이미지에서 검출합니다.



Main Code


import cv2

src = cv2.imread("hats.png", cv2.IMREAD_GRAYSCALE)
templit = cv2.imread("hat.png", cv2.IMREAD_GRAYSCALE)
dst = cv2.imread("hats.png")

result = cv2.matchTemplate(src, templit, cv2.TM_SQDIFF_NORMED)

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)
x, y = minLoc
h, w = templit.shape

dst = cv2.rectangle(dst, (x, y), (x +  w, y + h) , (0, 0, 255), 1)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()



Detailed Code


src = cv2.imread("hats.png", cv2.IMREAD_GRAYSCALE)
templit = cv2.imread("hat.png", cv2.IMREAD_GRAYSCALE)
dst = cv2.imread("hats.png")

원본 이미지(src)템플릿 이미지(templit)을 선언합니다.

탬플릿 매칭은 그레이스케일 이미지를 사용하므로, cv2.IMREAD_GRAYSCALE를 적용합니다.

결과를 표시할 결과 이미지(dst)를 선언합니다.



result = cv2.matchTemplate(src, templit, cv2.TM_SQDIFF_NORMED)

템플릿 매칭 함수(cv2.matchTemplate)로 템플릿 매칭을 적용합니다.

cv2.matchTemplate(원본 이미지, 템플릿 이미지, 템플릿 매칭 플래그)을 의미합니다.

원본 이미지템플릿 이미지는 8비트의 단일 채널 이미지를 사용합니다.

템플릿 매칭 플래그는 템플릿 매칭에 사용할 연산 방법을 설정합니다.


템플릿 매칭 플래그

플래그 수식
cv2.TM_SQDIFF 3
cv2.TM_SQDIFF_NORMED 4
cv2.TM_CCORR 5
cv2.TM_CCORR_NORMED 6
cv2.TM_CCOEFF 79
cv2.TM_CCOEFF_NORMED 8



반환되는 결괏값(dst)은 32비트의 단일 채널 이미지로 반환됩니다.

또한, 배열의 크기는 W - w + 1, H - h + 1의 크기를 갖습니다.

(W, H)는 원본 이미지의 크기이며, (w, h)는 템플릿 이미지의 크기입니다.

결괏값이 위와 같은 크기를 갖는 이유는 원본 이미지에서 템플릿 이미지를 일일히 비교하기 때문입니다.

예를 들어, 4×4 크기의 원본 이미지와 3×3 크기의 템플릿 이미지가 있다면 아래의 그림과 같이 표현할 수 있습니다.



10



4번의 비교를 진행할 수 있으며, 이를 배열로 옮긴다면 2×2 크기를 갖게 됩니다.

수식으로 다시 표현한다면, \((W - w + 1, H - h + 1) = (4 - 3 + 1, 4 - 3 + 1) = (2, 2)\)가 됩니다.



minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)
x, y = minLoc
h, w = templit.shape

결괏값(dst)에서 가장 유사한 부분을 찾기 위해 최소/최대 위치 함수(cv2.minMaxLoc)로 검출값을 찾습니다.

최소/최대 위치 함수최소 포인터, 최대 포인터, 최소 지점, 최대 지점을 반환합니다.

검출 위치의 좌측 상단 모서리 좌표는 최소 지점(minLoc)이나 최대 지점(maxLoc)에 위치합니다.

템플릿 이미지를 일일히 비교하므로, 이미지 크기는 템플릿 이미지와 동일합니다.


  • Tip : cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED최소 지점(minLoc)이 검출된 위치입니다.
  • Tip : cv2.TM_CCORR, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF, cv2.TM_CCOEFF_NORMED최대 지점(maxLoc)이 검출된 위치입니다.



dst = cv2.rectangle(dst, (x, y), (x +  w, y + h) , (0, 0, 255), 1)

검출된 결과를 결과 이미지(dst)위에 표시합니다.



Result


11


도움이 되셨다면 광고 클릭 부탁드립니다.


Book Image

책이 출간되었습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C# OpenCvSharp4
  • Python OpenCV4
  • Using Tesseract
  • Using TensorFlow
  • Using Regular Expression
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]


    ⤧  Previous post Python OpenCV 강좌 : 제 36강 - 적응형 이진화 ⤧  Next post Python OpenCV 강좌 : 제 38강 - ORB(Oriented FAST and Rotated BRIEF)
    Python-OpenCV Category