Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 OpenCV를 사용한 템플릿 일치

<시간/>

템플릿 매칭은 실제 이미지에서 패치나 템플릿을 매칭할 수 있는 기술이다. 이것은 기본적으로 패턴 일치 메커니즘입니다.

Python에는 OpenCV 모듈이 있습니다. openCV를 사용하여 일치하는 항목을 쉽게 찾을 수 있습니다. 그래서 이 문제에서는 OpenVC 템플릿 매칭 기법을 사용합니다.

OpenCV 기능을 사용하려면 pip를 사용하여 다운로드해야 합니다. .

sudo pip3 install opencv-python

템플릿 일치 작업의 경우 정확도 요소가 있으며 이 요소를 임계값이라고 합니다. 예를 들어 이 템플릿 매칭 솔루션을 사용하여 얼굴 인식 체계를 쉽게 만들 수 있다고 말할 수 있습니다. 우리는 눈이나 얼굴의 다른 부분의 이미지를 제공할 수 있습니다. 그런 다음 해당 이미지를 템플릿으로 사용하여 일치하는 항목을 쉽게 찾을 수 있지만 눈에는 다양한 변형이 있습니다. 따라서 정확도 수준을 50%로 설정하면 정확도 수준 100%보다 더 잘 감지합니다. 일반적으로 정확도 수준은 다른 경우에 80%입니다.

템플릿 일치 단계

  • 실제 이미지를 가져와 그레이 스케일 이미지로 변환합니다.

  • 템플릿을 그레이 스케일 이미지로 사용

  • 템플릿이 실제 이미지 위로 미끄러져 정확도 수준이 일치하는 위치를 찾습니다.

  • 결과가 정확도 수준보다 크면 해당 위치를 감지됨으로 표시합니다.

첫 번째 경우 입력 이미지와 템플릿은 -

메인 이미지

<중앙> Python에서 OpenCV를 사용한 템플릿 일치

템플릿

<중앙> Python에서 OpenCV를 사용한 템플릿 일치

예시 코드

import cv2
import numpy as np
#open the main image and convert it to gray scale image
main_image = cv2.imread('main_image.png')
gray_image = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY)
#open the template as gray scale image
template = cv2.imread('template1.png', 0)
width, height = template.shape[::-1] #get the width and height
#match the template using cv2.matchTemplate
match = cv2.matchTemplate(gray_image, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
position = np.where(match >= threshold) #get the location of template in the image
for point in zip(*position[::-1]): #draw the rectangle around the matched template
   cv2.rectangle(main_image, point, (point[0] + width, point[1] + height), (0, 204, 153), 0)
cv2.imshow('Template Found', main_image)
cv2.waitKey(0)

출력

<중앙> Python에서 OpenCV를 사용한 템플릿 일치

위 코드는 멀티 스케일링을 지원하지 않습니다. 따라서 템플릿의 크기가 같지 않으면 감지하지 않습니다. 따라서 다음 부분에서는 멀티 스케일링 기능을 사용하여 템플릿을 감지하는 방법을 살펴보겠습니다.

이 접근 방식에서 실제 이미지는 패턴과 일치할 때마다 다른 크기로 변환되고 일치하는 위치를 찾기 위해 가장 큰 상관 계수를 찾습니다.

실제 이미지는 동일하고 템플릿은 여기에 있습니다 −

<중앙> Python에서 OpenCV를 사용한 템플릿 일치

예시 코드

import imutils
import cv2
import numpy as np
#Open template and get canny
template = cv2.imread('template3.jpg')
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
template = cv2.Canny(template, 10, 25)
(height, width) = template.shape[:2]
#open the main image and convert it to gray scale image
main_image = cv2.imread('main_image.png')
gray_image = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY)
temp_found = None
for scale in np.linspace(0.2, 1.0, 20)[::-1]:
   #resize the image and store the ratio
   resized_img = imutils.resize(gray_image, width = int(gray_image.shape[1] * scale))
   ratio = gray_image.shape[1] / float(resized_img.shape[1])
   if resized_img.shape[0] < height or resized_img.shape[1] < width:
      break
   #Convert to edged image for checking
   e = cv2.Canny(resized_img, 10, 25)
   match = cv2.matchTemplate(e, template, cv2.TM_CCOEFF)
   (_, val_max, _, loc_max) = cv2.minMaxLoc(match)
   if temp_found is None or val_max>temp_found[0]:
      temp_found = (val_max, loc_max, ratio)
#Get information from temp_found to compute x,y coordinate
(_, loc_max, r) = temp_found
(x_start, y_start) = (int(loc_max[0]), int(loc_max[1]))
(x_end, y_end) = (int((loc_max[0] + width)), int((loc_max[1] + height)))
#Draw rectangle around the template
cv2.rectangle(main_image, (x_start, y_start), (x_end, y_end), (153, 22, 0), 5)
cv2.imshow('Template Found', main_image)
cv2.waitKey(0)

출력

<중앙> Python에서 OpenCV를 사용한 템플릿 일치