728x90
탬플릿 매치
- 팀팰릿 매칭은 큰 이미지에서 탬플릿 이미지의 위치를 찾아내는 방법이라 할수 있습니다.
- opencv에선 cv2.matchTemplate()이란 함수를 제공하고있는데요. 단순히 탬플릿 이미지를 2차원 컨볼루션처럼 슬라이드하고, 탬플릿과 이미지 일부(이미지와 탬플릿이 겹친 부분)를 비교 한다고 할수 있겠습니다.
- 여기서는 탬플릿과 이웃한 픽셀들로 이루어진 흑백 영상을 반환하게 됩니다.
- W x N 크기의 입력 영상과 w x h 크기의 탬플릿 영상이 주어지면, W-w+1, H-h+1 크기의 출력 영상이 나오게 되는데 여기서 cv2.minMaxLoc()함수로 왼쪽위 코너점의 좌표와 영역의 폭과 높이를 반환해 줍니다. 이 사각 영역이 탬플릿의 공간이라 할수 있겠습니다.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('C:/Users/do/Documents/github/opencv_python/res/messi.jpg',0)
img2 = img.copy()
template = cv2.imread('C:/Users/do/Documents/github/opencv_python/res/template.jpg',0)
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
for meth in methods:
img = img2.copy()
method = eval(meth)
# Apply template Matching
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img,top_left, bottom_right, 255, 2)
plt.subplot(121),plt.imshow(res,cmap = 'gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img,cmap = 'gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.suptitle(meth)
plt.show()
탬플릿 매치로 다중 물체 검출하기
- 이전 장에서는 메시 얼굴을 찾아냈다면 이번에는 다중 물체를 검출하겠습니다.
- 이번과 같이 다중 물체 검출의 경우 cv2.minMaxLoC()는 모든 물체의 위치를 알려주지 못하므로 이번에는 임계화를 통해 마리오 게임에서 코인들을 찾아내겠습니다.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv2.imread('C:/Users/do/Documents/github/opencv_python/res/mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
img_rgb = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2RGB)
template = cv2.imread('C:/Users/do/Documents/github/opencv_python/res/mario_coin.png',0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
plt.imshow(img_rgb)
plt.show()
#cv2.imwrite('res.png',img_rgb)
300x250
'로봇 > 영상' 카테고리의 다른 글
opencv-python 튜토리얼 - 19. 워터셰드 알고리즘으로 영상 분할 (0) | 2020.08.15 |
---|---|
opencv-python 튜토리얼 - 18. 허프 변환 (0) | 2020.08.15 |
opencv-python 튜토리얼 - 16. 푸리에 변환 (2) | 2020.08.15 |
opencv-python 튜토리얼 - 15. 히스토그램 (0) | 2020.08.15 |
opencv-python 튜토리얼 - 14. 이미지 피라미드 (0) | 2020.08.15 |