[리원아빠] 파이썬 화면에서 특정 영역 찾기

2023. 1. 11. 15:29Python

반응형

 


파이썬 화면에서 특정 영역 찾기



파이썬에서 제공하는 pyautogui 모듈 중 locateOnScreen 함수는

 

인자로 전달된 사진 이미지 내용을 분석 후

 

해당 사진 이미지와 동일한 영역이 있다면 해당 영역의 좌표 정보를 반환해준다.

 

신기하면서도 아주 간단하게 사용할 수 있는 locateOnScreen 함수에 대해 알아보자.

 

import pyautogui

login_btn = pyautogui.locateOnScreen("C:\\users\\root\desktop\\btn.png")
print(login_btn)

사용법은 아주 간단하다.

 

pyautogui 모듈을 임포트 한 후

 

단순히 locateOnScreen 함수를 호출하면서 찾고자 하는 이미지 파일을 전달하면 된다.

 

 

작성자는 테스트를 위해 미리 네이버 홈페이지의 로그인 버튼을 캡쳐해 btn.png 파일로 저장했다.

 

 

미리 캡쳐해 놓은 이미지 파일과 locateOn Screen 함수를 호출해본 결과이다.

 

왼쪽은 화면에서 이미지 내용을 찾지 못 했을 때 리턴값이고

 

오른쪽은 화면에서 이미지 내용을 찾았을 경우 그 이미지가 화면상에 위치한 좌표와 사이즈를 반환한다.

 

단 한줄로 내가 원하는 영역을 찾아내준다는게 정말 신기하고 놀랍기만 하다.

 

 

import pyautogui

login_btn = pyautogui.locateCenterOnScreen("C:\\users\\root\desktop\\btn.png")
pyautogui.click(login_btn)

좀 더 활용해 보도록하자.

 

pyautogui 모듈은 locateOnScreen 함수 말고도 locateCenterOnScreen 함수도 제공한다.

 

이름처럼 locateCenterOnScreen 함수는 찾아낸 이미지 영역의 좌표 중앙값을 리턴한다.

 

그럼 우리는 locateOnScreen 함수와 locateCenterOnScreen 함수를 어떻게 사용할 수 있을까?

 

 

 

작성한 코드를 수행해보자.

 

총 2번의 테스트를 진행했으며 처음에는 네이버 로그인 버튼이 다 보이지 않고 부분만 보이도록 했다.

 

이처럼 찾아야할 영역이 완벽하게 일치하지 않는 경우에는 None 값을 반환하기에 아무런 변화가 없다.

 

두번째 테스트 경우엔 로그인 버튼이 다 보이도록 스크롤을 조절했다.

 

locateCenterOnScreen 함수에 인자로 전달한 btn.png와 온전히 동일한 영역을 찾을 수 있기에 

 

딜레이라고 거의 느낄 수 없을 정도로 빠른 속도로 클릭이 되는 모습을 확인할 수 있다.

 

이처럼 단 한줄로 특정 영역을 찾아내 클릭까지 가능한 함수이다 보니

 

활용될 영역은 그야말로 무궁무진할듯 하다.

 

자동 로그인 프로그램은 물론 좀 더 정교하고 시간만 투자한다면

 

더 완성도 높은 매크로 프로그램을 만들 수 있을 것이다.

 

그럼 끝.

 

 

### 23.01.19 추가 내용 ###

 

locateOnScreen,  locateCenterOnScreen 함수는 기본적으로

 

화면의 전체 영역을 탐색하고 100%일치되는 정보를 찾는다.

 

그렇다보니 경우에 따라선 이미지정보가 일치함에도 불구하고 찾지 못하거나

 

속도가 생각보다 느린 경우도 발생한다.

 

이를 방지하기 위해 아래의 추가적인 옵션을 공유한다.

 

  • region = (X좌표, Y좌표, X좌표에서 이동값, Y좌표에서 이동값)
  • confidence = 정확도 #opencv-python 모듈 설치 필요

예시로 아래와 같이 사용하면 된다.

btn = pyautogui.locateOnScreen("btn.png", region=(1800, 0, 1920, 100), confidence=0.7)

추가로 동일한 이미지 영역이 여러개 존재한다면 아래 함수를 사용하면 된다.

 

pyautogui.locateAllOnScreen()

for i in pyautogui.locateAllOnScreen("btn.png"):
    pyautogui.click(i, duration=0.25)

 

반응형