LoginSignup
3
1

More than 1 year has passed since last update.

[Python] PyAutoGUI 画像認識のクリック・待機処理を関数化

Last updated at Posted at 2023-01-16

作ったプログラムの備忘録

はじめに

  • PyAutoGUIで画像認識させてクリックや待機処理をする際に、同じコードをコピペしまくるのはよくないので関数化
  • どのレベルで関数化するかは好みによるかもしれないが、個人的に便利な引数での設定をメモとして記載

[追記] 本記事は基本的なクリックと待機処理のみです。すこし応用した「複数画像のどれか」が表示されたらクリックする関数については以下のリンク先をご覧ください。

動作テスト環境

OS: Windows 10 Pro 64bit
言語: Python 3.9.13
ライブラリ:PyAutoGUI 0.9.53

ソースコード

import pyautogui
  • インポート

待機

def wait_img(img):
    for i in range(300):
        try:
            if pyautogui.locateOnScreen(f'./img/{img}', grayscale=True, confidence=.8):
                break
        except pyautogui.ImageNotFoundException:
            sleep(0.2)
    sleep(0.01)
  • 待機処理のみのコード
  • 引数として画像のファイル名(image.pngなど)を指定して、その画像が現れるまで待機する処理
  • この場合、0.2秒間隔で画像をチェックして、300回待機するので、60秒間は待機処理を継続する
  • 最後の0.01秒待機はPyAutoGUIを安定稼働させるための個人的なおまじない(処理が早すぎると安定しないので人間としては気にならないが、PC的には十分遅い処理にする)

クリック その1

def click_img(img, sleeptime):
    p = pyautogui.locateOnScreen(f'./img/{img}', grayscale=True, confidence=.8)
    x, y = pyautogui.center(p)
    pyautogui.click(x, y, button='left')
    sleep(sleeptime)
  • 画像認識で指定の画像の真ん中を左クリックして、指定時間待機する処理
  • クリック後の待機処理はアプリごとにどの程度強制待機した方がよいかが異なるために引数として指定できるようにしている
  • 基本的にdef wait_img()と組み合わせる前提なので0.01秒や0.1秒程度の指定とすることが多い

クリック その2

def click_imgoffset(img, offsetx, offsety, sleeptime, conf, gray):
    p = pyautogui.locateOnScreen(f'./img/{img}', grayscale=gray, confidence=conf)
    x, y = pyautogui.center(p)
    pyautogui.click(x + offsetx, y + offsety, button='left')
    sleep(sleeptime)
  • 画像認識で指定した画像から指定した座標分オフセットした位置をクリックする処理
  • クリックしたい位置の画像が複数画面上に存在してしまう場合や特徴があまりないときに、別の画像を起点にクリックさせるために作成
  • 引数のgrayscale, confidenceを設定できるようにするかは好み。個人的にはなくてもほぼ困っていないが、たまに変えたい場合も発生する

使用例

wait_img('image1.png')
click_img('image1.png', 0.01)
  • image1.pngが現れるのを待って、クリック
wait_img('image2.png')
click_imgoffset('image2.png', 0, -55, 0.01, .8, True)
  • image1.pngが現れるのを待って、そこからxに0pixel、yに-55pixelの位置をクリック
wait_img('image3.png')
pyautogui.typewrite('text', interval=0.001)
  • ちなみに待機処理とクリック処理を分離させているのは、待機処理後にクリックをしない場合もそこそこ発生するから
  • 例としては画面が出てきた際にデフォルトでカーソルがアクティブになる類のソフトウェアでは上記のコードのようにそのまま文字を入力すればいい場合などがある

補足

p = pyautogui.locateOnScreen(f'./img/{img}', grayscale=True, confidence=.8)
  • 上記のコードのgrayscale=Trueは画像をグレイスケールとして処理する引数。多少処理が速くなるのと処理精度は体感で変化ないので指定している
  • confidence=.8は画像認識の一致度?を指定している。1だと完全一致らしいが、その指定では画像認識がうまくいかず処理が進まないことが多いので、0.8としてしている(.8という表記は元にしたコードがその表記だったからで正式なものか不明)
  • また引数confidenceを使用する場合は、PyAutoGUIが内部でOpenCVを使用するらしいのでインストールが必要
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1