화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

파이썬 pyautogui 매크로 프로그램 만들기 두번째 강좌입니다. 화면에서 클릭할 부분만 스크린샷을 찍어 위치가 바뀌더라도 이미지를 인식하여 자동으로 좌표를 알아내어 마우스가 언제나 정확하게 클릭하도록 프로그램을 만드는 방법을 강의합니다.

import pyautogui

# 미리 만들어놓은 이미지가 화면상 어느 위치에 있는지 찾기
num7 = pyautogui.locateOnScreen('7.png')
print(num7)

# 좌표와 크기를 지정하여 이미지로 저장
pyautogui.screenshot('1.png', region=(1071, 802, 30, 30))
pyautogui.screenshot('7.png', region=(1092, 602, 30, 30))

# 이미지 위치의 중간 좌표를 반환
num7 = pyautogui.locateCenterOnScreen('7.png')
num1 = pyautogui.locateCenterOnScreen('1.png')

# 좌표를 클릭
pyautogui.click(num7)
pyautogui.click(num1)

print(num7)
print(type(num7))

i, k = num7

print(i)
print(k)

-파이썬 매크로 프로그램 만들기 pyautogui 첫번째 강의-

https://youtu.be/zl8yTv69jmk

유튜브 김플 스튜디오에 방문하시면 더 많은 파이썬 강의를 보실수 있습니다.

김플 스튜디오 Go!

이미지맥스(ImageMax)는 인식대상 애플리케이션의 화면상에서 이미지를 검색하고 각종 마우스 클릭, 키보드 입력 등 다양한 동작을 자동화 하는 툴입니다.

지금 부터 이미지맥스 툴에 대해 기본적인 사용방법과 스크립트를 기반한 매크로 동작을 공부해보겠습니다.

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

기본적인 사용에 앞서 우선 이미지맥스가 동작할 프로그램을 설정해야 합니다.

프로그램을 실행하면 초기화면이 다음과 같이 나오는데 '인식 대상' -> '설정' 버튼을 통해 인식 대상을 지정할수 있습니다.

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo
화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

연습을 위해 그림판을 열어 지정해보도록 하겠습니다.

아래와 같이 실제 동작이 될 화면으로 마우스를 옮기면 붉은 테투리 영역으로 인식되는것을 확인할수 있습니다.

인식 대상이 맞다면 마우스 왼쪽 버튼 클릭 혹은 키보드 F2 를 누르면 인식 영역이 설정됩니다.

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo
화면 인식 기반 매크로 - hwamyeon insig giban maekeulo
화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

인식 대상 지정후 확인을 누르면 '인식 대상' 에 선택한 애플리케이션의 윈도우 이름을 확인할수 있습니다.

그렇다면 기본적으로 이미지 맥스가 동작할 수 있는 최소 설정을 마친 샘입니다.

[ ! ] 인식 대상을 설정후 화면의 윈도우 크기를 변경하면 인식 대상을 다시 설정해야 합니다.

윈도우의 크기가 변경되면 앞으로 진행할 이미지 검색, 클릭등의 행동에 좌표가 바뀌어 정상 동작을 하지 않게 되니 가능하면 인식대상 설정후에는 윈도우의 크기를 변경하지 않도록 합니다.

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

파이썬 매크로 시리즈


준비물

  • 파이참
  • 파이썬

제가 지금껏 전처리를 게임에 써오면서 다양한 함수들을 다루어 봤는데, 제가 확인한 가장 효율적인 전처리와 확실하게 먹히는 전처리 방법을 소개합니다.

전처리를 하면 이미지 서치의 인식률도 높일 수 있고, 머신러닝에 사용하여 조금씩 바뀌는 이미지에 대해 매크로를 만들 수 있습니다.

사실 여기까지 하신다면, 일반적인 게임 매크로를 만드시는 데에는 지장이 없을 겁니다.


라이브러리 설치

pip install opencv-python

이미지 전처리

이미지 전처리는 이미지의 테두리, 밝은 곳과 어두운 곳을 확실히 구분해서 이미지 서치를 좀 더 확실하고 정확하게 이용할 수 있습니다.

또한 게임에서 단순 이미지 서치를 방지하기 위해서 각종 노이즈를 집어넣는 경우가 있습니다.

이럴 경우에 노이즈를 제거하여 구분할 수 있습니다.

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

이 이미지를 전처리할 것입니다.

(많이 익숙한 화살표입니다.)
노이즈도 껴있고, 색깔도 다양해서 머신러닝 학습이나, 이미지 서치에 부적합하다고 볼 수 있습니다.

가우시안 블러로 전반적인 노이즈 뭉개기

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

결과는 이렇습니다.

처음과 비교해 보면, 노이즈가 뭉개진 것을 확인할 수 있습니다.

img = cv2.GaussianBlur(img, (3, 3), 0)

(3, 3), (5, 5)와 같이 홀수로 값을 바꿔주면서 적정 값을 찾으면 됩니다.

HSV형태로 변환하여 테두리 뚜렷하게 만들기

화살표 같은 경우에는 테두리로 인식이 가능할 수 있습니다.

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

HSV형태에서 각각의 h, s, v 값을 변경하여 흑백으로 만들기

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo
coefficients = (0.001, 0, 1.2)  # (h, s, v)
img = cv2.transform(img, np.array(coefficients).reshape((1, 3)))

hsv값을 조절하여 전반적으로 색을 빼주었습니다.

이로써 화살표의 테두리는 더욱더 뚜렷해졌습니다.

회색화 하여 이미지 반환하기

scr = Image.fromarray(img)
scr = scr.convert('L')
return scr

마지막에 pillow 이미지 형태로 변환한 뒤 흑백으로 바꾸어 주었습니다.

이때 pillow 이미지로 변환한 이유는 pyautogui에서의 이미지 서치는 pillow이미지 형태를 사용하기 때문입니다.

완성된 함수

import numpy as np
import cv2
from PIL import Image

def preprocessing():
    img = Image.open("test.png") #pillow 형태로 받기
    img = np.array(img) #numpy 형태로 변환
    img = cv2.GaussianBlur(img, (3, 3), 0) #가우시안 블러 적용
    img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #HSV형태로 변환
    coefficients = (0.001, 0, 1.2)  # (h, s, v)
    img = cv2.transform(img, np.array(coefficients).reshape((1, 3))) #색 빼주기
    scr = Image.fromarray(img)
    scr = scr.convert('L')
    return scr #반환

예시

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

다른 게임입니다.

이 게임은 픽셀이 보이는 게임인데, 풍선이 움직일 때마다 픽셀 값이 바뀌게 되어서 일반 이미지로는 이미지 서치가 힘듭니다.

따라서 위와 같은 전처리로 전반적인 픽셀을 뭉개고, 테두리를 강화함으로써 이미지 서치에 유리하게 만들 수 있습니다.

이 전처리가 사용된 매크로

https://lemon7z.tistory.com/69

메이플스토리 오토룬

본 글은 인공지능 학습을 목적으로 한 게시글입니다. 따라서 소스코드는 공개하지 않습니다. 준비물 파이썬 IDE - 파이참 (https://lemon7z.tistory.com/30) 텐서플로우 openCV 목차 결과 영상 원리 제작과정

lemon7z.tistory.com

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

다른 방법의 전처리

화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

이 표지판을 전처리하여 머신러닝에 이용하도록 하는 함수입니다.

def preprocessing():
    img = Image.open("circle.png")
    img = np.array(img)
    img = cv2.GaussianBlur(img, (9, 9), 0)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    coefficients = (0.001, 0, 1.1)  # (h, s, v)
    img = cv2.transform(img, np.array(coefficients).reshape((1, 3)))
    img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, -1)
    cv2.imwrite("temp.png", img)
    imgtemp = Image.open('temp.png')
화면 인식 기반 매크로 - hwamyeon insig giban maekeulo

결과입니다.

이 상태에서 동그라미를 인식하는 함수를 이용하여 표지판만 추출할 수 있습니다.

후기

짧지만 6부작의 매크로 설명글을 써보았습니다.

몇십번, 몇백번 만들어보면서 생긴 노하우나, 실질적으로 이용할 함수를 소개해보았습니다.

따라서 제가 소개한 방법보다 더 효율적인 방법이 있을 수 있습니다.

하지만 지금 처음 시작하시는 분들께 더 좋은 시작을 드리고자 이 글을 작성해 보았습니다^^

그리고 사실 백그라운드 이미지 서치와 클릭에 대한 내용도 있었지만, 대부분의 온라인 게임은 안될 뿐더러, 모바일게임은 adb를 이용하는게 더 쾌적하기에 내용을 뺐습니다.

다들 성공적으로 만드시길 바랍니다.

감사합니다!