본문 바로가기
소프트웨어/파이썬

[파이썬] OpenCV 이미지 서치 (Template matching)

by 만들오 2022. 2. 9.
안녕하세요? 만들오 입니다.

파이썬 라이브러리 OpenCV를 이용한 이미지 서치기능 구현에 관한 글 입니다.

 

이미지 서치란?

배경화면에서 특정 이미지의 위치를 찾아내는것 입니다. 저는 이 기능을 게임화면 분석에 사용하려 합니다.


1. 사용 코드
import cv2
import numpy as np

img = cv2.imread("nopotion.jpg") # 배경이미지
#img = cv2.imread("normal.jpg") # 배경이미지
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 배경이미지를 흑백으로 변환
target = cv2.imread("target.jpg", cv2.IMREAD_GRAYSCALE) # 찾을 이미지. 불러올때부터 흑백


w, h = target.shape[::-1] # 타겟의 크기값을 변수에 할당

res = cv2.matchTemplate(imgGray, target, cv2.TM_CCOEFF_NORMED)
threshold = 0.8 # 0~1의 값. 높으면 적지만 정확한 결과. 낮으면 많지만 낮은 정확도.
loc = np.where(res>=threshold) # res에서 threshold보다 큰 값만 취한다.
for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2) # 결과값에 사각형을 그린다

cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

※ 코드에 관한 자세한 설명은 OpenCV 홈페이지 또는 추가 검색을 추천드립니다.

 

2. 적용 이미지

배경 이미지는 사용중인 리니지W 게임의 스크린샷을 이용했습니다.

왼쪽은 물약이 다 떨어진 상태이고, 오른쪽은 물약이 있는 상태입니다.

찾을 이미지는 물약이 다 떨어졌을때 나오는 이미지 입니다.


3. 실행 결과

물약이 다 떨어진 왼쪽 배경대상 이미지가 있는 왼쪽에 빨간색 박스가 그려져 있습니다.


4. 고려할 점

게임은 프레임 단위로 움직이는 이미지 입니다. 찾을 이미지의 배경이 달라 잘 찾아지지 않을 수도 있습니다. 이럴 땐 threshold 값을 조정해 최적의 값을 찾는 노력을 해야 합니다.

 

5. 마무리

OpenCV의 matchTemplate 기능으로 이미지 서치를 써봤습니다. 저는 공돌이로써... 잘 활용만 하면 된다는 마인드이기 때문에 깊이있게 알지는 못합니다😂

그래도 궁금하신 부분은 댓글을 남겨주시면 감사하겠습니다.

[끝].

728x90

댓글