Pyautogui 이미지 인식 실패 - Pyautogui imiji insig silpae

PyAutoGUI 이미지로 마우스 이동¶

프로그램이 항상 조금씩 다른 위치에서 실행되기 때문에 화면 상의 특정한 위치에 마우스를 위치시키기가 까다로울 수 있습니다.

이런 상황에서 화면 상의 특정 영역의 이미지 파일을 갖고 있으면 그 영역을 찾아서 클릭할 수 있습니다.

아래의 예제를 통해 계산기가 어디에 있든 항상 똑같은 버튼을 클릭하도록 해보겠습니다.

순서는 아래와 같습니다.

Pyautogui 이미지 인식 실패 - Pyautogui imiji insig silpae

우선 계산기의 특정 영역을 캡처해서 해당 폴더에 아래와 같이 ‘five.PNG’ 파일로 저장합니다.

five.PNG

1. 이미지 영역 찾기¶

locateOnScreen()¶

import pyautogui

five_btn = pyautogui.locateOnScreen('five.PNG')
print(five_btn)

locateOnScreen() 에 그림(‘five.PNG’)를 설정해주면, 아래와 같이 화면 상에서 일치하는 영역을 찾아서 왼쪽 위의 위치와 영역의 가로, 세로 크기를 튜플의 형태((left, top, width, height))로 출력합니다.

해당 영역을 찾지 못하면 None 을 반환합니다.

2. 이미지 영역의 가운데 위치 얻기¶

center()¶

import pyautogui

five_btn = pyautogui.locateOnScreen('five.PNG')
center = pyautogui.center(five_btn)
print(center)

center() 함수를 사용하면, 해당 영역의 가운데 위치(클릭할 지점)를 튜플의 형태로 얻을 수 있습니다.

center를 출력하면 (1462, 675)가 출력됩니다.

3. 클릭하기¶

click()¶

import pyautogui

center = pyautogui.locateCenterOnScreen('five.PNG')
pyautogui.click(center)

이미지 영역을 찾고 가운데 지점을 찾는 더 쉬운 방법은 locateCenterOnScreen() 함수를 사용하는 것입니다.

아래와 같이 click(center) 를 통해 계산기의 5 버튼의 가운데 위치가 클릭됩니다.

Pyautogui 이미지 인식 실패 - Pyautogui imiji insig silpae

화면 상에서 계산기의 위치가 바뀌어도 항상 똑같은 위치를 클릭할 수 있습니다.

1920×1080 화면 기준으로, 클릭에 1~2초 정도가 걸리기 때문에 게임에 적용하기는 어려울 수 있지만 대부분의 어플리케이션에서 사용될 수 있습니다.

because file is missing, has improper permissions, or is an unsupported or invalid format

한글 경로가 있으면 이런 오류가 나타납니다..


해결방법은 numpy -> opencv -> pyautogui로 해결하면 됩니다.

Pyautogui 이미지 인식 실패 - Pyautogui imiji insig silpae

Tree구조는 이렇습니다.

import os
import pyautogui
import numpy as np

import cv2

path=os.path.dirname(os.path.realpath(__file__))
img = os.path.join(path,'이미지','img_002.png')

n = np.fromfile(img, np.uint8)
img = cv2.imdecode(n, cv2.IMREAD_COLOR)

i=pyautogui.locateOnScreen(img)
print(i)

출처 : https://jangjy.tistory.com/337

--- 참고 ---

더보기

pyautogui 이미지 인식관련해서는 차피 opencv로 구성되어 있기 때문에 오류가 나면 pyautogui로 검색 하는 것보다 opencv로 검색하는것이 잘 나옵니다..

추가로 함수로 함 만들어 봤습니다.

import os
import cv2
import numpy as np
import pyautogui


# pyautogui 이미지 한글이름 함수
def imread(path,filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8):
    try:
        here_IMG = os.path.join(path,filename)
        n = np.fromfile(here_IMG, dtype)
        img = cv2.imdecode(n, flags)
        i=pyautogui.locateOnScreen(img)
        
        return i
    
    except Exception as e:
        print(e)
        
        return None
    

#테스트
path=os.path.dirname(os.path.realpath(__file__))
path = os.path.join(path,'이미지')

print(imread(path,'img_002.png'))

1. 네이버 화면에서 좌측 상단 메뉴의 이메일 아이콘을 클릭하여 메일 메뉴로 들어간다면..

Pyautogui 이미지 인식 실패 - Pyautogui imiji insig silpae

가. 아이콘 이미지 캡쳐하여 저장 (현재 workspace폴더\mail.png)

Pyautogui 이미지 인식 실패 - Pyautogui imiji insig silpae

나. mail.png 이미지를 찾아 커서 이동 후 클릭

import pyautogui

try:

    # mail.png 찾기

    mail_icon = pyautogui.locateOnScreen('mail.png')

    # mail.png 좌표 Box(left=384, top=274, width=27, height=29) 만약 이미지 못찾으면 None 출력

    print(mail_icon)

    # 이미지로 이동

    pyautogui.moveTo(mail_icon)

    # 이미지 클릭 (이미지 정가운데 부분)

    pyautogui.click()

except OSError as exp:

    print(exp)

다. 이미지는 좌측 상단부터 우측으로 차례로 찾는다.

라. 위 코드는 찾고자 하는 이미지가 우측하단쪽에 있을 경우 속도가 느린 단점이 있다. 이에 다음과 같이

grayscale 옵션을 줄 경우 모든 이미지를 음영처리하여 찾기 때문에 약 30% 속도 개선이 발생한다. 하지만 정확도가 떨어지는 단점이 있다.

mail_icon = pyautogui.locateOnScreen('mail.png', grayscale=True)

마. 두번째 방법으로는 이미지를 찾는 범위를 지정할 수 있다.

# 시작지점 x, y 좌표, 가로/세로 길이

mail_icon = pyautogui.locateOnScreen('mail.png', region=(x, y, width, height))

바. 세번째 방법으로는 정확도를 줄이는 방법이 있다. confidence 옵션을 주어 정확도를 낮추면 이미지를 쉽게 찾을 수 있다. 하지만 정확도가 낮아질 수록 잘못된 이미지를 찾을 수 있다.

Terminal > pip install opencv-python

# confidence의 기본값은 0.999 (99.9% 일치할 경우)

mail_icon = pyautogui.locateOnScreen('mail.png', confidence=0.8) # 80% 이상 일치할 경우

사. 화면 전환 등의 이미로 찾고자 하는 대상 이미지가 바로 보여지지 않을 경우 처리

mail_icon = pyautogui.locateOnScreen('mail.png')

while mail_iconis None:

    mail_icon = pyautogui.locateOnScreen("mail.png")

pyautogui.click(mail_icon)

2. 동일한 이미지가 여러개일 경우.. 예를 들면 아래 그럼의 체크박스를 모두 클릭해야한다면

Pyautogui 이미지 인식 실패 - Pyautogui imiji insig silpae

가. 아이콘 이미지 캡쳐하여 저장 (현재 workspace폴더\checkbox.png)

Pyautogui 이미지 인식 실패 - Pyautogui imiji insig silpae

나. checkbox.png 이미지를 찾아 모두 클릭

import pyautogui

try:

# locateAllOnScreen 모든 이미지 찾기

# 만약 locateOnScreen를 사용한다면 처음 발견하는 이미지만 처리 후 종료

for i in pyautogui.locateAllOnScreen("checkbox.png"):

    # 이미지 좌표값 출력

    print(i)

    # 체크박스 클릭

    pyautogui.click(i)

except OSError as exp:

    print(exp)