Python에서 OpenCV를 사용한 템플릿 매칭

Manav Narula 2024년2월15일
  1. matchTemplate() 함수를 사용하여 Python에서 OpenCV를 사용하여 템플릿 일치 수행
  2. 결론
Python에서 OpenCV를 사용한 템플릿 매칭

Python의 opencv 라이브러리는 많은 기술과 알고리즘을 구현합니다. 이 라이브러리를 사용하여 다양한 Computer Vision 및 AI 작업을 수행할 수 있습니다.

이 라이브러리의 이러한 기능 중 하나는 템플릿 일치입니다.

이 기술에 대해 자세히 설명하겠습니다. 템플릿 매칭은 이미지의 작은 부분이 다른 이미지의 일부인지 여부를 확인하는 것입니다.

템플릿의 가장 가능성 있는 위치를 찾기 위해 이 작은 부분(템플릿이라고도 함)을 이미지 위로 가로 및 세로로 이동합니다. opencv를 사용한 템플릿 매칭은 특히 객체 감지와 같은 많은 실제 응용 프로그램을 가지고 있습니다.

이 튜토리얼은 Python에서 opencv를 사용하여 템플릿 일치를 수행하는 방법을 보여줍니다.

matchTemplate() 함수를 사용하여 Python에서 OpenCV를 사용하여 템플릿 일치 수행

matchTemplate() 함수는 이미지에서 주어진 템플릿의 위치를 ​​찾는 데 사용할 수 있습니다. 두 이미지를 모두 이 함수에 전달할 수 있습니다. 그러면 템플릿이 양방향으로 슬라이드되어 가장 일치하는 위치를 찾을 수 있습니다.

각 위치의 픽셀 밀도가 계산되며 가장 높은 밀도(밝은 픽셀)가 일치할 가능성이 가장 높습니다. matchTemplate()은 여러 메소드를 사용하며 method 매개변수를 사용하여 지정됩니다.

총 6개가 있습니다: TM_CCOEFF, TM_CCOEFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_SQDIFFTM_SQDIFF_NORMED.

TM_CCORR은 부정확한 결과로 인해 좋은 선택으로 간주되지 않습니다. 기억해야 할 또 다른 사항은 TM_SQDIFFTM_SQDIFF_NORMED 메서드의 경우 최소값을 선택한다는 것입니다.

이것은 아래의 예를 보면 명확해질 것입니다.

이제 이 기능에 대해 자세히 논의했으므로 실제 예제를 살펴보겠습니다. 템플릿과 전체 이미지가 아래에 표시되고 그 뒤에 코드와 결과가 표시됩니다.

영상:

이미지 처리 중

주형:

템플릿 처리

import cv2

i = cv2.imread("deftstack.png")
img = cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)
temp = cv2.imread("temp.png", 0)
width, height = temp.shape[::-1]

result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF)
val_min, val_max, min_loc, max_loc = cv2.minMaxLoc(result)
t_left = max_loc
b_right = (t_left[0] + width, t_left[1] + height)

cv2.rectangle(i, t_left, b_right, 255, 2)
cv2.imshow("Output", i)
cv2.waitKey(0)
cv2.destroyAllWindows()

출력:

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

이제 코드에 대해 자세히 논의해 보겠습니다. 필요한 이미지를 읽는 것으로 시작합니다.

cvtColor() 함수를 사용하여 이 이미지를 회색조로 변환하여 이미지를 필요한 색상 공간으로 변환합니다. 흑백 이미지가 최상의 결과를 제공합니다.

템플릿과 이미지를 TM_CCOEFF 메소드와 함께 matchTemplate() 함수에 전달합니다.

이것은 numpy 배열을 반환합니다. 좌표를 찾으려면 이 배열의 값 집합이 필요합니다.

minMaxLoc() 함수는 배열의 최소값 및 최대값과 해당 인덱스를 찾습니다. 가장 일치하는 좌표를 계산하기 위해 최대값의 위치를 ​​사용합니다.

rectangle() 함수를 사용하여 일치하는 부분 위에 직사각형을 그립니다. 그러면 이미지가 결과와 함께 표시됩니다.

waitKey()destroyAllWindows() 함수는 출력 창이 자동으로 닫히는 것을 방지하고 일부 사용자 입력을 기다립니다.

논의한 바와 같이 matchTemplate() 함수 내에서 논의된 다른 방법을 유사하게 사용할 수 있습니다. 유일한 차이점은 TM_SQDIFFTM_SQDIFF_NORMED 방법과 관련이 있다는 것입니다.

코드를 약간 수정하여 사용할 수 있습니다. 다음 예를 참조하십시오.

import cv2

i = cv2.imread("deftstack.png")
img = cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)
temp = cv2.imread("temp.png", 0)
width, height = temp.shape[::-1]

result = cv2.matchTemplate(img, temp, cv2.TM_SQDIFF)
val_min, val_max, min_loc, max_loc = cv2.minMaxLoc(result)
t_left = min_loc
b_right = (t_left[0] + width, t_left[1] + height)

cv2.rectangle(i, t_left, b_right, 255, 2)
cv2.imshow("Output", i)
cv2.waitKey(0)
cv2.destroyAllWindows()

출력:

python TM_SQDIFF에서 opencv를 사용한 템플릿 매칭

위의 예는 최소값 인덱스를 사용하여 템플릿 좌표를 계산하는 것을 보여줍니다. 나머지 코드는 동일하게 유지됩니다.

결론

이 튜토리얼은 파이썬에서 opencv를 사용한 템플릿 매칭 기법을 보여주었습니다. 템플릿 매칭의 기본과 이 기술을 구현하는 opencv 라이브러리의 기능에 대해 논의했습니다.

기능과 관련된 몇 가지 방법도 논의되었습니다. 우리는 이 기능과 다른 여러 기능을 사용하여 이 기술의 실제 작동 예를 보았습니다.

각 라인의 목적을 강조하여 자세히 논의했습니다.

작가: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn