[RPA] 데스크탑UI - 스크린, 이미지처리, 이미지처리(속도개선), 이미지처리(대기)

2021. 7. 29. 17:30·Tools/RPA
YouTube 나도코딩님의 동영상을 보면서 공부한 내용입니다.
부족한 내용이나 잘못된 내용은 댓글남겨주시면 감사하겠습니다!
출처 : https://www.youtube.com/channel/UC7iAOLiALt2rtMVAWWl4pnw

1. 스크린

# 스크린 샷 찍기 - pyautogui.screenshot()

import pyautogui
# 스크린 샷 찍기
img = pyautogui.screenshot()
img.save("screenshot.png") #파일로 저장

screenshot.png

 

# 내가 클릭하려고 하는 부분의 RGB값을 비교해 정말 그곳이 맞는지 판단 - pixelMatchesColor(x, y,(R,G,B))

- 먼저 mouseInfo()로 클릭하려고 하는 부분의 좌표, RGB추출

- RGB값은 pixel를 통해 구할 수도 있으

- 맞으면 true, 틀리면 false

# 위치 정보
# pyautogui.mouseInfo()
# 965,18 81,0,81 #510051

# 픽셀의 RGB 값 출력
pixel = pyautogui.pixel(965,18) #주어진 좌표 값에 해당하는 픽셀을 가져옴
print(pixel)

# 내가 클릭하려고 하는 부분의 RGB값을 비교해 정말 그곳이 맞는지 판단 - 맞으면 True
# print(pyautogui.pixelMatchesColor(965,18, (81,0,81)))
print(pyautogui.pixelMatchesColor(965,18, pixel))

맞을 경우                /                틀릴 경우


2. 이미지 처리

(이미지는 항상 png로 저장)

# 사진의 위치 정보 - locateOnScreen("사진")

- 클릭하고 싶은 부분을 캡쳐해서 저장

- 이미지를 찾으면 이미지의 위치를 클릭

import pyautogui
file_menu = pyautogui.locateOnScreen("file_menu.png") #file_menu.png이미지의 정보를 찾아 반환
print(file_menu)
pyautogui.click(file_menu)

 

# 사진의 위치로 마우스 이동

trash_icon = pyautogui.locateOnScreen("trash_icon.png")
pyautogui.moveTo(trash_icon)

만약 이미지를 못찾으면 None 반환

 

# 동일한 사진 여러개 동시 수행 - locateAllOnScreen("사진")

- w3school checkbox사용

https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_type_checkbox

# 체크박스 3개 한번에 클릭
for i in pyautogui.locateAllOnScreen("checkbox.png"): # 이미지의 모든 정보 가져옴
    print(i)
    pyautogui.click(i)

 

# 위와 같은 작업을 locateOnScreen()으로 할경우 - 맨 처음에 나오는 사진만 수행

# 위와 동일한 작업을 locateOnScreen으로 할 경우 - 맨 처음 체크박스만 표시됨
checkbox = pyautogui.locateOnScreen("checkbox.png")
pyautogui.click(checkbox)

 

# 6_image_recognition

import pyautogui
# 사진과 동일한 부분을 클릭
# file_menu = pyautogui.locateOnScreen("file_menu.png") #file_menu.png이미지의 정보를 찾아 반환
# print(file_menu)
# pyautogui.click(file_menu)

# 사진의 위치로 마우스 이동
# trash_icon = pyautogui.locateOnScreen("trash_icon.png")
# pyautogui.moveTo(trash_icon)

# 사진이 없는 경우 - None
# screen = pyautogui.locateOnScreen("screenshot.png")
# print(screen)

# 체크박스 3개 한번에 클릭
# for i in pyautogui.locateAllOnScreen("checkbox.png"): # 이미지의 모든 정보 가져옴
#     print(i)
#     pyautogui.click(i)

# 위와 동일한 작업을 locateOnScreen으로 할 경우 - 맨 처음 체크박스만 표시됨
checkbox = pyautogui.locateOnScreen("checkbox.png")
pyautogui.click(checkbox)

3. 이미지처리_속도개선

# 1. GrayScale - 컬러로 되어 있는 이미지를 흑백으로 전환 후 비교 30% 속도 개선 -> 정확도는 떨어질 수 있음

- grayscale=True

trash_icon = pyautogui.locateOnScreen("trash_icon.png", grayscale=True)
pyautogui.moveTo(trash_icon)

 

# 2. 범위 지정 - 원래는 전체 범위에서 찾았지만 region을 이용하면 지정한 범위에서만 찾음 

- region=(x,y,with, height)

# pyautogui.mouseInfo()
# 1541,490 240,240,240 #F0F0F0
# 1766,751 255,255,255 #FFFFFF

trash_icon = pyautogui.locateOnScreen("trash_icon.png", region=(1541, 490, 1766-1541, 751-490))
pyautogui.moveTo(trash_icon)

 

# 3. 정확도 조정 - 픽셀 하나하나가 완전히 똑같지 않아도 몇퍼센트 이상이면 똑같다고 인식

- confidence 기본값은 0.99로 90%

pip install opencv-python

check = pyautogui.locateOnScreen("check.png", confidence=0.9) # confidene : 기본값 0.99로 99%
pyautogui.moveTo(check)

 

# 6_image_recognition.py

import pyautogui
# 사진과 동일한 부분을 클릭
# file_menu = pyautogui.locateOnScreen("file_menu.png") #file_menu.png이미지의 정보를 찾아 반환
# print(file_menu)
# pyautogui.click(file_menu)

# 사진의 위치로 마우스 이동
# trash_icon = pyautogui.locateOnScreen("trash_icon.png")
# pyautogui.moveTo(trash_icon)

# 사진이 없는 경우 - None
# screen = pyautogui.locateOnScreen("screenshot.png")
# print(screen)

# 체크박스 3개 한번에 클릭
# for i in pyautogui.locateAllOnScreen("checkbox.png"): # 이미지의 모든 정보 가져옴
#     print(i)
#     pyautogui.click(i)

# 위와 동일한 작업을 locateOnScreen으로 할 경우 - 맨 처음 체크박스만 표시됨
# checkbox = pyautogui.locateOnScreen("checkbox.png")
# pyautogui.click(checkbox)

# 속도 개선
# 1. GrayScale - 컬러로 되어 있는 이미지를 흑백으로 전환 후 비교 30% 속도 개선 -> 정확도는 떨어질 수 있음
# trash_icon = pyautogui.locateOnScreen("trash_icon.png", grayscale=True)
# pyautogui.moveTo(trash_icon)

# 2. 범위 지정 - 원래는 전체 범위에서 찾았지만 region을 이용하면 지정한 범위에서만 찾음
# pyautogui.mouseInfo()
# 1541,490 240,240,240 #F0F0F0
# 1766,751 255,255,255 #FFFFFF

# trash_icon = pyautogui.locateOnScreen("trash_icon.png", region=(1541, 490, 1766-1541, 751-490))
# pyautogui.moveTo(trash_icon)

# 3. 정확도 조정 - 픽셀 하나하나가 완전히 똑같지 않아도 몇 % 이상이면 똑같다고 인식하는거
# check = pyautogui.locateOnScreen("check.png", confidence=0.9) # confidene : 기본값 0.99로 99%
# pyautogui.moveTo(check)

4. 이미지처리_대기

# 자동화 대상이 바로 보여지지 않는 경우 

# 1. 계속 기다리기 - while문 사용

file_menu_notpad = pyautogui.locateOnScreen("file_menu_notepad.png")
# 화면에 메모장이 가려져 있으므로 file_menu_notpad는 None가 들어감
while file_menu_notpad is None: # 노트패드가 발견될까지 반복해서 찾음
    file_menu_notpad = pyautogui.locateOnScreen("file_menu_notepad.png")
    print("발견 실패")
pyautogui.click(file_menu_notpad)

 

# 2. 일정시간동안 기다리기 - TimeOut

import time # 시간 사용하기 위해
import sys # 프로그램 종료하기 위해

timeout = 10 #10초대기
start = time.time() # 시작 시간 설정
file_menu_notpad = None
while file_menu_notpad is None:
    file_menu_notpad = pyautogui.locateOnScreen("file_menu_notepad.png")
    end = time.time() # 종료 시간 설정
    if end - start > timeout: # 지정한 10초를 초과하면
        print("시간 종료")
        sys.exit()

pyautogui.click(file_menu_notpad)

 

# 위 코드 함수로 정의

def find_target(img_file, timeout=30):
    start = time.time()
    target = None
    while target is None:
        target = pyautogui.locateOnScreen(img_file)
        end = time.time()
        if end - start > timeout:
            break
    return target

def my_click(img_file, timeout=30):
    target = find_target(img_file, timeout)
    if target:
        pyautogui.click(target)
    else:
        print(f"[Timeout {timeout}s] Target not found ({img_file}). Terminate program.")
        sys.exit()

my_click("file_menu_notepad.png", 10)

- 파일이 없을 경우

 

# 6_image_recognition

import pyautogui
# 사진과 동일한 부분을 클릭
# file_menu = pyautogui.locateOnScreen("file_menu.png") #file_menu.png이미지의 정보를 찾아 반환
# print(file_menu)
# pyautogui.click(file_menu)

# 사진의 위치로 마우스 이동
# trash_icon = pyautogui.locateOnScreen("trash_icon.png")
# pyautogui.moveTo(trash_icon)

# 사진이 없는 경우 - None
# screen = pyautogui.locateOnScreen("screenshot.png")
# print(screen)

# 체크박스 3개 한번에 클릭
# for i in pyautogui.locateAllOnScreen("checkbox.png"): # 이미지의 모든 정보 가져옴
#     print(i)
#     pyautogui.click(i)

# 위와 동일한 작업을 locateOnScreen으로 할 경우 - 맨 처음 체크박스만 표시됨
# checkbox = pyautogui.locateOnScreen("checkbox.png")
# pyautogui.click(checkbox)

# 속도 개선
# 1. GrayScale - 컬러로 되어 있는 이미지를 흑백으로 전환 후 비교 30% 속도 개선 -> 정확도는 떨어질 수 있음
# trash_icon = pyautogui.locateOnScreen("trash_icon.png", grayscale=True)
# pyautogui.moveTo(trash_icon)

# 2. 범위 지정 - 원래는 전체 범위에서 찾았지만 region을 이용하면 지정한 범위에서만 찾음
# pyautogui.mouseInfo()
# 1541,490 240,240,240 #F0F0F0
# 1766,751 255,255,255 #FFFFFF

# trash_icon = pyautogui.locateOnScreen("trash_icon.png", region=(1541, 490, 1766-1541, 751-490))
# pyautogui.moveTo(trash_icon)

# 3. 정확도 조정 - 픽셀 하나하나가 완전히 똑같지 않아도 몇 % 이상이면 똑같다고 인식하는거
# check = pyautogui.locateOnScreen("check.png", confidence=0.9) # confidence : 기본값 0.99로 99%
# pyautogui.moveTo(check)

# 자동화 대상이 바로 보여지지 않는 경우
# 1. 계속기다리기
# file_menu_notpad = pyautogui.locateOnScreen("file_menu_notepad.png")
# # 화면에 메모장이 가려져 있으므로 file_menu_notpad는 None가 들어감
# # if file_menu_notpad:
# #     pyautogui.click(file_menu_notpad)
# # else:
# #     print("발견 실패")
# while file_menu_notpad is None: # 노트패드가 발견될까지 반복해서 찾음
#     file_menu_notpad = pyautogui.locateOnScreen("file_menu_notepad.png")
#     print("발견 실패")
# pyautogui.click(file_menu_notpad)

# 2. 일정 시간동안 기다리기(TimeOut)
import time # 시간 사용하기 위해
import sys # 프로그램 종료하기 위해

# timeout = 10 #10초대기
# start = time.time() # 시작 시간 설정
# file_menu_notpad = None
# while file_menu_notpad is None:
#     file_menu_notpad = pyautogui.locateOnScreen("file_menu_notepad.png")
#     end = time.time() # 종료 시간 설정
#     if end - start > timeout: # 지정한 10초를 초과하면
#         print("시간 종료")
#         sys.exit()
#
# pyautogui.click(file_menu_notpad)

# 위 코드함수로 정의
def find_target(img_file, timeout=30):
    start = time.time()
    target = None
    while target is None:
        target = pyautogui.locateOnScreen(img_file)
        end = time.time()
        if end - start > timeout:
            break
    return target

def my_click(img_file, timeout=30):
    target = find_target(img_file, timeout)
    if target:
        pyautogui.click(target)
    else:
        print(f"[Timeout {timeout}s] Target not found ({img_file}). Terminate program.")
        sys.exit()

my_click("file_menu_notepad.png", 10)

'Tools > RPA' 카테고리의 다른 글

[RPA] 데스크탑UI - 파일시스템  (0) 2021.07.31
[RPA] 데스크탑UI - 윈도우, 키보드, 메시지박스, 로그  (0) 2021.07.29
[RPA] 데스크탑UI - 환경설정, 마우스이동, 마우스액션, 마우스정보  (0) 2021.07.29
[RPA] 엑셀 - 조건에 맞게 수정후 최종성적내기  (0) 2021.07.29
[RPA] 엑셀 - 수식, 데이터수식, 병합, 병합해제, 이미지  (0) 2021.07.28
'Tools/RPA' 카테고리의 다른 글
  • [RPA] 데스크탑UI - 파일시스템
  • [RPA] 데스크탑UI - 윈도우, 키보드, 메시지박스, 로그
  • [RPA] 데스크탑UI - 환경설정, 마우스이동, 마우스액션, 마우스정보
  • [RPA] 엑셀 - 조건에 맞게 수정후 최종성적내기
min_sol
min_sol
  • min_sol
    비글개발연구소🐾
    min_sol
  • 전체
    오늘
    어제
    • 분류 전체보기 (278)
      • Programming (128)
        • Algorithm (52)
        • JAVA (40)
        • GIS (5)
        • PyQt (10)
        • C# (11)
        • Mobile (6)
        • AI (4)
      • Backend (36)
        • Spring (14)
        • JSP (11)
        • Network (5)
      • Frontend (29)
        • React (11)
        • Vue (13)
        • Next.js (4)
      • Database (10)
        • PostgreSQL (1)
        • Oracle (8)
        • Elasticsearch (1)
      • DevOps (8)
        • Linux (7)
        • Mac (1)
      • Tools (31)
        • IntelliJ (1)
        • GitHub (10)
        • RPA (20)
      • Security (9)
      • etc (21)
        • ERROR (5)
        • 세미나 | 교육 (10)
        • 자격증 (1)
        • 일상 (2)
        • 2021 (2)
  • 인기 글

  • 태그

    PyQt
    vue.js
    명품자바에센셜
    자바
    VUE
    jsp
    연습문제
    스윙
    자료구조
    spring
    PyQt5
    코딩테스트
    자동화
    계산기
    Java
    RPA
    이클립스
    알고리즘
    생능출판
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
min_sol
[RPA] 데스크탑UI - 스크린, 이미지처리, 이미지처리(속도개선), 이미지처리(대기)
상단으로

티스토리툴바