본문 바로가기
Study/Python

[Python] OpenCV - 6 템플릿 매칭

by YoungD 2023. 10. 26.
# 템플릿 매칭
# 배경 사진에서 원하는 물체 찾기
# 메이플 배경 이미지에서 파란 달팽이, 초록 버섯 찾기
# 좌상단부터 한 픽셀씩 움직이면서 원하는 물체와 배경이 유사한지 검색
In [1]:
import cv2
# 배경화면
img = cv2.imread('images/maple.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # 흑백 이미지로 만들어주면 더 빨리 찾을 수 있음

blue_snail = cv2.imread('images/blue_snail.jpg')
blue_snail_gray = cv2.cvtColor(blue_snail, cv2.COLOR_RGB2GRAY)
h1, w1 = blue_snail_gray.shape # 찾을 대상(흑백 이미지)의 세로, 가로 크기 받아오기

green_mush = cv2.imread('images/green_mush.jpg')
green_mush_gray = cv2.cvtColor(green_mush, cv2.COLOR_RGB2GRAY)
h2, w2 = green_mush_gray.shape

# 이미지 찾기(배경이미지, 찾을 이미지, 찾을 방법 값을 넣어줌)
res1 = cv2.matchTemplate(img_gray, blue_snail_gray, cv2.TM_CCOEFF_NORMED )
res2 = cv2.matchTemplate(img_gray, green_mush_gray, cv2.TM_CCOEFF_NORMED )

import numpy as np
loc = np.where(res1 >= 0.75)
loc2 = np.where(res2 >= 0.75)
# array 위 = y값, 아래 = x값

# 데이터 순서 역으로 바꾸기
for pt in zip(*loc[::-1]):
    # print(pt) # x,y 좌표가 들어있음
    # 배경 이미지에 위치 사각형으로 표현하기
    # cv2.rectangle(배경이미지, 좌상단 좌표, 우하단 좌표, 색상, 두께)
    cv2.rectangle(img, pt, (pt[0] + w1, pt[1] + h1), (0,0,255), 3 )

for pt in zip(*loc2[::-1]):
    cv2.rectangle(img, pt, (pt[0] + w2, pt[1] + h2), (255,0,0), 3 )

cv2.imshow('maple',img)
#cv2.imshow('snail',blue_snail)
#cv2.imshow('mush',green_mush)
cv2.waitKey(0)
cv2.destroyAllWindows()

In [2]:
# 배경과 찾는 이미지가 얼마나 유사한지
# -1 ~ 1 , -1 = 전혀 상관없음, 1 = 완전 똑같음
# 유사도가 0.7 이상인 값들만 사용
import numpy as np
loc = np.where(res1 >= 0.75)
# array 위 = y값, 아래 = x값

# 데이터 순서 역으로 바꾸기
for pt in zip(*loc[::-1]):
    print(pt)
# for문 & zip 함수 사용해서 (X, y)로묶어주기 
# array 위 = X값, 아래 = y값
# 'X좌표 233, y좌표 29인 곳에 있다'
(233, 29)
(454, 411)
(455, 411)
(455, 412)
(522, 531)
(523, 531)
(522, 532)
(523, 532)
(524, 532)
(985, 532)
(986, 532)
(523, 533)
(524, 533)
(985, 533)
(986, 533)
(319, 684)
(988, 684)
(218, 685)
(219, 685)
(319, 685)
(320, 685)
(409, 685)
(549, 685)
(550, 685)
(681, 685)
(682, 685)
(731, 685)
(988, 685)
(989, 685)
(218, 686)
(219, 686)
(409, 686)
(550, 686)