IT 대장간

[파이썬] 업무자동화 2.이미지 기반 본문

Programing/Python

[파이썬] 업무자동화 2.이미지 기반

태장장이 2021. 3. 15. 16:43

1.활용방법

: 현재 화면 상에 있는 이미지를 인식하여 실행 시 해당 이미지에 대한 이벤트 수행

 

★사용처

* 웹 상에서의 전송, 로그인, 메일 보내기

* 바탕화면 상 아이콘에 대한 이미지 인식 및 실행 등

* 그 외 개인이 사용하는 프로그램에 주요 기능에 대한 단축키가 없을 경우 등

 

-> 개인적으로는 모의해킹 수행 시 웹 자동화 공격에 일부 활용될 여지가 있다고 보여 유용하다고 판단.

 

2. 사진으로 설명하는 예제

: VSCode가 켜져있는 상황, 프로그램 실행 시 "Settings" 창 활성화 까지 자동화 된 마우스 클릭

실제론 단축키가 있어서 무의미하며, 참고용 예제일뿐입니다.

 

 

 

1) 이벤트를 수행할 이미지 파일 생성

: 직접 캡쳐해서 저장하면된다 : )

 

 

2) 코드

import pyautogui

file_menu = pyautogui.locateOnScreen("file_menu.png") #현재 화면에서 file_menu.png 이미지에 대한 값을 저장
print(file_menu) # 정상인식 확인용 출력문
pyautogui.click(file_menu) # 해당 이미지를 찾아 클릭

prefer = pyautogui.locateOnScreen("Preferences.png")
print(prefer)
pyautogui.click(prefer)

setting = pyautogui.locateOnScreen("Setting.png")
print(setting)
pyautogui.click(setting)

 

: 이미지 변수 저장 ->  해당 이미지를 인식하여 화면 상에서 클릭하는 과정이라 보면된다.

 

 

 

 

실행시, 터미널 출력(print) 내용

: 보이는 것처럼 해당 이미지 파일을 인식하여 좌표화 시킨다.

만약 해당 이미지를 화면상에서 인식하지 못할 경우 None값을 반환하게 되는데

보통 이미지 파일을 다시 뜨거나 범위를 좀더 넓혀서 하면 인식이 쉽게 된다.

 

 

 

화면 실행

 

: 세팅창을 여는 과정을 클릭을 통해 자동 수행 된 모습

 

 

동일 이미지가 다수 있을 경우

checkbox = pyautogui.locateAllOnScreen("checkbox.png")


for i in checkbox :
    print(i)
    pyautogui.click(i)

: locateAllonScreen 함수 사용, 반복문을 통한 수행

 

 

 

 

 

 

 

웹 페이지 :  w3school checkbox 예제 활용

 

 

 

<코드 실행>

 

 

 

3. 색인 속도 향상 , 정확도 향상

: 스크린에서 이미지를 매칭시키는 데에는 시간이 제법 걸리며, 이미지를 못찾는 경우가 꽤 빈번하게 나타나므로 유용함

 

 

1) 속도 향상

 

이번엔  DEBUG CONSOLE을 인식하여 마우스를 이동 시키는 예제로, region 속성값을 추가하지않을 경우 약 10초~15초 정도 걸렸던 것 같다.

 

하지만 파일을 변수에 대입시키는 과정에서 영역을 할당해주면 체감상 바로 찾는 다는 느낌을 주었다. (화살표 지점)

 

 

region ( 시작지점 x, 시작지점 y , width, height) : 네모 박스를 쳐서 영역을 할당하는 개념으로 보면된다.

 

 

 

 

2) 정확도 향상

 

 

: 패키지 다운로드 (opencv-python)

 

 

 

*confidence 속성값 추가

 

: 기본적으로 %단위로 이미지 일치화를 색인한다.

 

추측 상 시간이 오래걸리는 이유는 프로그램 실행 시 

x=0, y=0 부터 쭉 훑어나가는데 한번에 못찾을 경우 보다 색인 단위를 보다 쪼개어 실행하는듯하다

 

그래서 인지 정확도를 낮출경우 색인 범위(region)을 지정하지 않아도

 

곧장찾게 되어 속도 향상의 기능도 포함 되어 있다 볼 수 있다.

 

 

 

4. 반복 수행

#3) 화면 상 해당 이미지를 찾을 때까지 수행
memo_file = pyautogui.locateOnScreen("memo_file.png", confidence = 0.7)


while memo_file is None : 
    memo_file = pyautogui.locateOnScreen("memo_file.png", confidence = 0.7) #이 값이 None일 경우 반복수행
    print("발견 실패")
    

pyautogui.click(memo_file)
print("발견 성공")

 

 

 

#4) 일정 시간동안까지 찾기

import time 
import sys



timeout = 5 #5초 대기
start = time.time()
memo_file = pyautogui.locateOnScreen("memo_file.png", confidence = 0.7)

while memo_file is None :
    memo_file = pyautogui.locateOnScreen("memo_file.png", confidence = 0.7) # 이 값이 None일 경우 반복수행
    end = time.time()
    pyautogui.sleep(0.8)
    print("{0}초 경과".format(int(end-start)))
    if end - start > timeout :
        print("발견에 실패하여 다음 단계로 넘어 갑니다.")
        sys.exit()

pyautogui.click(memo_file)

 

발견 실패 시 터미널 레코드 값

 

 

 

해당 이미지 인식하였을 경우 결과 (+notepad 내 '파일' 탭을 변수에 저장)