카테고리 없음

[Python] 이미지 서치로 매크로를 만들어보자 / pyautogui

대장코린이 2023. 7. 20. 21:05

안녕하세요, 대장코린이입니다.

오늘은 매크로의 꽃 pyautogui를 이용한 이미지 서치를 배워보겠습니다.

도움이 되었으면 좋겠습니다.


목차
1. 이미지 서치 : locateOnScreen
2. 게임 매크로 만들기

1. 이미지 서치 : locateOnScreen

img = './img.png'
region = (100,100,10,10)
confidence= 0.9
pos = gui.locateOnScreen(img,confidence=confidence,region=region)

In [1]: pos
Out[1]: Box(left=1420, top=602, width=24, height=26)

locateOnScreen은 화면상에서 이미지를 검색하는 함수입니다.

만약 이미지를 찾을 시, 해당 이미지의 영역을 반환하고, 찾지 못하면 None을 반환합니다.

 

confidence를 설정하여 유사도를 설정할 수 있는데,

confidence가 1이라면 이미지가 완벽히 일치하는 영역을 검색하고, 낮아질 수록 비슷한 이미지를 검색합니다.

 

region은 이미지를 검색할 영역을 지정해주는 것인데, 입력하지 않을 시 모든 화면에 대해 검색합니다.

화면이 커질 수록 이미지를 검색할 영역이 커지기 때문에 가능한 최적화를 시켜주는 것이 효율적이겠죠?

보통 효율을 높히거나, 영역을 특정짓기 위해 사용합니다.

 

def screen_catch(img,region,confidence=0.92):
    for i in range(3):
        pos = gui.locateOnScreen(img,confidence=confidence,region=region)
        time.sleep(0.1)
        if pos != None:
            return pos
    if pos == None:       
        return

저는 이런식으로 이미지 서치를 사용합니다.

안정성을 키우기 위해 이미지를 검색할 때 한번만 검색하지 않고, 0.1초 간격으로 3번 검색하는데 중간에 이미지를 찾을 시 그 영역을 반환합니다.

 

def click(box):
    center = gui.center(box)
    gui.click(center)
    time.sleep(0.01)
    return

이미지를 찾았으면 클릭을 해야겠죠.

영역은 Box 자료형으로 반환받기 때문에 가운데 영역을 클릭해봅시다.

center 함수는 Box를 입력하면 그 중심 좌표를 반환해주는 함수입니다.

네, 이미지 서치와 짝궁입니다.

 

자 이제 충분히 매크로를 만들기 위해 필요한 내용은 모두 배웠습니다.

간단한 매크로를 만들어봅시다.


2. 게임 매크로 만들기

네, 간단한 게임 매크로를 만들며 익숙해져봅시다.

해당 게임은 아주 간단한 마우스 테스트인데요, 목표물의 가운데를 최대한 빠르고 정확하게 클릭하는 게임입니다.

https://www.arealme.com/aim-test/ko/

 

온라인 사격 능력 테스트

마우스로 정교한 2D 사격 능력을 테스트합니다. 일반적인 프로게이머는 350점 이상, 탑클래스 프로게이머는 450점 이상을 받습니다. 당신도 도전해보세요!

www.arealme.com

 

저는 455점정도 나오네요,

한번 직접만든 매크로는 어떤지 봅시다.

 

import pyautogui as gui
import keyboard
import time

## 이미지 검색
def screen_catch(img,region,confidence=0.92):
    for i in range(3):
        #pos = gui.locateOnScreen(file,region=(1840,986,60,25))
        pos = gui.locateOnScreen(img,confidence=confidence,region=region)
        time.sleep(0.001)
        if pos != None:
            return pos
    if pos == None:       
        return 
        
 ## 클릭
def click(box):
    center = gui.center(box)
    gui.click(center)
    time.sleep(0.01)
    return 

## 좌표 입력하기
def get_positions():
    locations = []
    while 1:
        if keyboard.is_pressed('F1'):
            pos = gui.position()
            print(pos)
            locations.append(pos)
            time.sleep(0.5)
        if keyboard.is_pressed('F3'):
            print('stop record coordinate')
            return locations
 
img = './aim2.png'
pos = get_positions()
region = (pos[0].x, pos[0].y, pos[1].x-pos[0].x, pos[1].y- pos[0].y)
while 1:
    loc = screen_catch(img,region)
    if loc != None:
        click(loc)
        gui.moveTo(100,100)
    if keyboard.is_pressed('F3'):
        print('stop')
        break

코드는 이렇습니다.

처음에 효율성을 늘리기 위해 이미지를 검색할 영역을 입력받고,

계속 목표물 이미지를 검색하여 발견시 클릭하는 아주 간단한 코드입니다.

 

하지만 이정도의 수준만 되어도 아주 많은 것들을 할 수 있을거에요.

이미지를 검색하고 클릭하는데 딜레이를 줬더니 속도가 빨라지면 잘잡진 못하네요.

얘는 981점 나왔습니다 ㅎ


아무튼~~

오늘은 이미지를 검색하여 간단한 매크로를 만들어보았습니다~

다음엔 더 복잡한 매크로를 공유해보도록 할게요.

도움이 되었으면 좋겠습니다. 뿅!