안녕하세요? 만들오 입니다.
파이썬 라이브러리 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
'소프트웨어 > 파이썬' 카테고리의 다른 글
[파이썬] 소켓 통신 예제 (0) | 2022.02.15 |
---|---|
[파이썬] 1대의 아두이노와 여러앱과의 통신(작성중) (11) | 2022.02.15 |
[파이썬]PySimpleGUI - 간략한 소개 (6) | 2022.02.07 |
[파이썬] OpenCV로 GUI 만들기 (4) | 2022.01.21 |
[파이썬] 비활성 키 입력 코드 공유 (6) | 2022.01.13 |
댓글