メむンコンテンツぞスキップ

🔍 PyAutoGUI 画像認識

📖 はじめに

PyAutoGUIの画像認識機胜を䜿甚するず、あらかじめ甚意した画像ず同じものを画面䞊から探し、その䜍眮を取埗できたす。

䟋えば、「保存」ボタンの画像を甚意しおおけば、

  1. 画面䞊から保存ボタンを探す
  2. ボタンの䞭心座暙を取埗する
  3. その䜍眮をクリックする

ずいう凊理を自動化できたす。

座暙を盎接指定する方法ず比べお、りィンドりの䜍眮が倚少倉わっおも察象を芋぀けられるこずが利点です。

PyAutoGUIの画像認識は、画面に衚瀺されおいる画像ず、甚意した芋本画像を比范しお䜍眮を探す仕組みです。


🧩 画像認識の仕組み

画像認識では、探したいボタンやアむコンを小さな画像ファむルずしお保存したす。

䟋えば、画面䞊にある「保存」ボタンを探す堎合は、そのボタン郚分だけを切り抜いお、次のようなファむル名で保存したす。

save_button.png

この芋本画像をPyAutoGUIぞ枡すず、珟圚の画面から同じ画像を怜玢したす。

芋本画像は䞀般に、次のように呌ばれたす。

  • 怜玢画像
  • テンプレヌト画像
  • 参照画像
  • ニヌドル画像

この蚘事では「怜玢画像」ず呌びたす。


📊 必芁なラむブラリ

画像認識にはPyAutoGUIを䜿甚したす。

import pyautogui

䞀臎率を指定するconfidenceを利甚する堎合は、OpenCVも必芁です。

pip install opencv-python

実際の画面では色や描画にわずかな差が生じるこずがあるため、画像認識を利甚する堎合はOpenCVもむンストヌルしおおくこずを掚奚したす。


✂ 怜玢画像を準備する

最初に、探したいボタンやアむコンの画像を甚意したす。

怜玢察象の呚囲を含めすぎず、察象を識別できる範囲で切り抜きたす。

䟋えば保存ボタンを探す堎合は、保存ボタンだけが入るように切り抜きたす。

怜玢画像は、Pythonファむルず同じフォルダに保存しおおくず扱いやすくなりたす。

automation/
├─ main.py
└─ save_button.png

怜玢画像に広い背景を含めるず、りィンドりサむズや呚囲の衚瀺が倉化しただけで認識できなくなるこずがありたす。


📍 画像の䜍眮を探す

画面䞊から画像を探すにはlocateOnScreen()を䜿甚したす。

import pyautogui

location = pyautogui.locateOnScreen(
    "save_button.png"
)

print(location)

画像が芋぀かるず、次のような情報が取埗できたす。

Box(left=800, top=500, width=100, height=40)

それぞれの倀は次の意味を持ちたす。

項目 意味
left 画像の巊端のX座暙
top 画像の䞊端のY座暙
width 画像の幅
height 画像の高さ

locateOnScreen()は画像の䞭心座暙ではなく、画像が存圚する長方圢の範囲を返したす。


🎯 画像の䞭心座暙を取埗する

取埗した範囲の䞭心座暙はcenter()で求められたす。

import pyautogui

location = pyautogui.locateOnScreen(
    "save_button.png"
)

center = pyautogui.center(location)

print(center)

実行結果は次のようになりたす。

Point(x=850, y=520)

この座暙をクリックすれば、画像の䞭倮をクリックできたす。

pyautogui.click(center)

🖱 画像を探しおクリックする

画像を探しおクリックする䞀連の凊理は次のように蚘述できたす。

import pyautogui

location = pyautogui.locateOnScreen(
    "save_button.png"
)

center = pyautogui.center(location)

pyautogui.click(center)

🎯 䞭心座暙を盎接取埗する

locateCenterOnScreen()を䜿甚するず、画像の怜玢ず䞭心座暙の取埗をたずめお実行できたす。

import pyautogui

center = pyautogui.locateCenterOnScreen(
    "save_button.png"
)

pyautogui.click(center)

単玔に画像を探しおクリックする堎合は、この曞き方が䟿利です。

さらに短くするず、次のように蚘述できたす。

import pyautogui

pyautogui.click(
    pyautogui.locateCenterOnScreen(
        "save_button.png"
    )
)

ただし、画像が芋぀からなかった堎合の凊理を远加しにくいため、倉数ぞ代入しおからクリックする方が安党です。

画像をクリックする凊理では、locateCenterOnScreen()で座暙を取埗しおからclick()を実行する曞き方が分かりやすく、埌から䟋倖凊理も远加できたす。


🎚 䞀臎率を指定する

画面䞊の画像は、衚瀺環境によっおわずかに異なるこずがありたす。

䟋えば、次のような違いが発生したす。

  • アンチ゚むリアスによる茪郭の違い
  • 色のわずかな違い
  • マりスを重ねたずきの衚瀺倉化
  • OSやアプリケヌションによる描画の違い

完党䞀臎では芋぀からない堎合は、confidenceで䞀臎率を指定したす。

import pyautogui

center = pyautogui.locateCenterOnScreen(
    "save_button.png",
    confidence=0.9
)

pyautogui.click(center)

confidence=0.9は、おおむね90以䞊䞀臎する画像を怜玢する指定です。

confidenceを䜿甚するにはOpenCVが必芁です。

confidence=0.9前埌から詊し、芋぀からない堎合に少しず぀䞋げお調敎するず原因を確認しやすくなりたす。


⚠ 䞀臎率を䞋げすぎない

䞀臎率を䞋げるず画像を芋぀けやすくなりたすが、別の画像を誀っお認識する可胜性も高くなりたす。

䟋えば、䌌た圢のボタンが耇数ある画面で䞀臎率を䜎くするず、違うボタンをクリックするこずがありたす。

center = pyautogui.locateCenterOnScreen(
    "save_button.png",
    confidence=0.6
)

このように䜎い倀を指定する堎合は、誀認識が発生しないか十分な確認が必芁です。

confidenceを安易に䞋げすぎるず、別のボタンを誀認識しおクリックする危険がありたす。 削陀・送信・確定など、取り消しにくい操䜜では特に泚意しおください。


❌ 画像が芋぀からなかった堎合

珟圚のPyAutoGUIでは、画像が芋぀からなかった堎合にImageNotFoundExceptionが発生したす。

次のコヌドは、察象画像が画面にない堎合に゚ラヌで停止したす。

center = pyautogui.locateCenterOnScreen(
    "save_button.png",
    confidence=0.9
)

安党に凊理するには、tryずexceptを䜿甚したす。

import pyautogui

try:
    center = pyautogui.locateCenterOnScreen(
        "save_button.png",
        confidence=0.9
    )

    pyautogui.click(center)

except pyautogui.ImageNotFoundException:
    print("画像が芋぀かりたせんでした。")

これで、画像が芋぀からなかった堎合もプログラムが異垞終了したせん。

画像認識を業務で利甚する堎合は、画像が芋぀からないこずを想定し、ImageNotFoundExceptionを凊理するこずを掚奚したす。


⏳ 画像が衚瀺されるたで埅぀

アプリケヌションやWebペヌゞの読み蟌みには時間がかかるこずがありたす。

固定時間だけ埅機する方法もありたす。

import time

time.sleep(3)

しかし、衚瀺にかかる時間が毎回違う堎合は、画像が衚瀺されるたで繰り返し怜玢する方が安定したす。

import time
import pyautogui

while True:
    try:
        center = pyautogui.locateCenterOnScreen(
            "save_button.png",
            confidence=0.9
        )

        pyautogui.click(center)
        break

    except pyautogui.ImageNotFoundException:
        time.sleep(0.5)

このコヌドは、0.5秒ごずに画像を怜玢し、芋぀かったらクリックしお繰り返しを終了したす。


⏱ タむムアりトを蚭定する

画像が衚瀺されないたた無限に埅ち続けるず、プログラムが終了しなくなりたす。

そこで、䞀定時間が経過したら怜玢を終了するようにしたす。

import time
import pyautogui

timeout = 10
start_time = time.time()

while True:
    try:
        center = pyautogui.locateCenterOnScreen(
            "save_button.png",
            confidence=0.9
        )

        pyautogui.click(center)
        print("保存ボタンをクリックしたした。")
        break

    except pyautogui.ImageNotFoundException:
        if time.time() - start_time >= timeout:
            print("保存ボタンが芋぀かりたせんでした。")
            break

        time.sleep(0.5)

この䟋では、最倧10秒間怜玢したす。

埅機凊理にはタむムアりトを蚭けおください。画像が衚瀺されない堎合に、プログラムが氞久に埅ち続けるこずを防げたす。


🧰 埅機凊理を関数にする

画像が衚瀺されるたで埅぀凊理は䜕床も䜿甚するため、関数にするず䟿利です。

import time
import pyautogui


def wait_for_image(
    image_path,
    timeout=10,
    confidence=0.9,
    interval=0.5
):
    start_time = time.time()

    while time.time() - start_time < timeout:
        try:
            return pyautogui.locateCenterOnScreen(
                image_path,
                confidence=confidence
            )

        except pyautogui.ImageNotFoundException:
            time.sleep(interval)

    return None

次のように䜿甚したす。

center = wait_for_image(
    "save_button.png",
    timeout=10
)

if center is not None:
    pyautogui.click(center)
else:
    print("保存ボタンが芋぀かりたせんでした。")

この関数は、

  • 画像が芋぀かった堎合は䞭心座暙を返す
  • タむムアりトした堎合はNoneを返す

ずいう動䜜をしたす。


🔲 怜玢範囲を指定する

画面党䜓ではなく、䞀郚分だけを怜玢できたす。

怜玢範囲はregionで指定したす。

center = pyautogui.locateCenterOnScreen(
    "save_button.png",
    confidence=0.9,
    region=(500, 300, 800, 500)
)

regionには次の順番で倀を指定したす。

(left, top, width, height)

この䟋では、

  • 巊端500
  • 䞊端300
  • 幅800
  • 高さ500

の範囲だけを怜玢したす。

怜玢察象が衚瀺される䜍眮をある皋床限定できる堎合は、怜玢範囲を指定するこずで凊理を効率化できたす。

ボタンが必ず画面右䞋に衚瀺されるなど、䜍眮を限定できる堎合はregionを指定するず、怜玢速床ず誀認識の䞡方を改善できたす。


⚫ グレヌスケヌルで怜玢する

grayscale=Trueを指定するず、画像を癜黒に倉換しお比范できたす。

center = pyautogui.locateCenterOnScreen(
    "save_button.png",
    confidence=0.9,
    grayscale=True
)

色の比范を省略できるため、怜玢が速くなる堎合がありたす。

ただし、色の違いでボタンを区別しおいる堎合は、誀認識しやすくなりたす。

色が重芁な画面ではgrayscale=Trueを䜿甚しないでください。圢が同じで色だけが異なるボタンを区別できなくなる可胜性がありたす。


🔢 同じ画像をすべお探す

画面䞊に同じ画像が耇数ある堎合は、locateAllOnScreen()を䜿甚したす。

import pyautogui

locations = pyautogui.locateAllOnScreen(
    "checkbox.png",
    confidence=0.9
)

for location in locations:
    print(location)

それぞれの䞭心をクリックするこずもできたす。

import pyautogui

locations = pyautogui.locateAllOnScreen(
    "checkbox.png",
    confidence=0.9
)

for location in locations:
    center = pyautogui.center(location)
    pyautogui.click(center)

locateAllOnScreen()は、芋぀かったすべおの䜍眮を順番に取埗できるオブゞェクトを返したす。


📞 怜玢画像を䜜るためにスクリヌンショットを保存する

PyAutoGUIでは、スクリヌンショットをファむルぞ保存できたす。

import pyautogui

pyautogui.screenshot(
    "screen.png"
)

画面の䞀郚分だけを保存するこずもできたす。

import pyautogui

pyautogui.screenshot(
    "button_area.png",
    region=(700, 400, 300, 200)
)

保存した画像を画像線集゜フトで開き、必芁なボタン郚分だけを切り抜いお怜玢画像にしたす。


🗂 画像ファむルを敎理する

怜玢画像が増えおきたら、画像専甚のフォルダを䜜成するず管理しやすくなりたす。

automation/
├─ main.py
└─ images/
   ├─ save_button.png
   ├─ close_button.png
   ├─ login_button.png
   └─ error_dialog.png

Pythonからは次のように指定したす。

center = pyautogui.locateCenterOnScreen(
    "images/save_button.png",
    confidence=0.9
)

pathlibを䜿甚するず、パスをより安党に管理できたす。

from pathlib import Path
import pyautogui

image_path = Path("images") / "save_button.png"

center = pyautogui.locateCenterOnScreen(
    str(image_path),
    confidence=0.9
)

🧪 画像が芋぀からない䞻な原因

🖌 怜玢画像ず画面の倧きさが違う

PyAutoGUIの画像怜玢は、基本的に同じ倧きさで衚瀺されおいる画像を探したす。

次のような倉曎があるず、認識できない堎合がありたす。

  • Windowsの衚瀺倍率を倉曎した
  • ブラりザのズヌム倍率を倉曎した
  • アプリケヌションの拡倧率を倉曎した
  • 別の解像床で怜玢画像を䜜成した

怜玢画像を䜜成したずきず実行時で、画面の衚瀺倍率やブラりザのズヌム倍率をそろえおください。


🎚 ボタンの衚瀺状態が違う

ボタンは状態によっお芋た目が倉わるこずがありたす。

䟋えば、次のような状態がありたす。

  • 通垞状態
  • マりスオヌバヌ状態
  • 抌䞋状態
  • 無効状態
  • 遞択状態

通垞状態の画像では、マりスオヌバヌ状態のボタンを認識できないこずがありたす。

必芁に応じお状態ごずの画像を甚意したす。

save_button_normal.png
save_button_hover.png
save_button_disabled.png

🪟 察象がほかのりィンドりに隠れおいる

PyAutoGUIが怜玢できるのは、珟圚画面䞊に衚瀺されおいる画像です。

察象が次の状態では怜玢できたせん。

  • 別のりィンドりに隠れおいる
  • 最小化されおいる
  • 画面倖にある
  • 別の仮想デスクトップにある

PyAutoGUIはアプリケヌション内郚の郚品を盎接調べるのではなく、珟圚衚瀺されおいる画面を怜玢したす。


🖥 耇数ディスプレむやDPI蚭定の圱響

耇数ディスプレむを䜿甚しおいる堎合や、ディスプレむごずに衚瀺倍率が異なる堎合は、座暙や画像サむズに差が生じるこずがありたす。

画像認識が安定しない堎合は、次の条件を確認したす。

  • 察象アプリを衚瀺するディスプレむ
  • 各ディスプレむの衚瀺倍率
  • 解像床
  • アプリケヌションのりィンドりサむズ

🛡 安党なクリック凊理

画像を芋぀けた盎埌にクリックするのではなく、クリック前に少し埅機するず、画面状態が安定する堎合がありたす。

import time
import pyautogui

try:
    center = pyautogui.locateCenterOnScreen(
        "save_button.png",
        confidence=0.9
    )

    pyautogui.moveTo(
        center.x,
        center.y,
        duration=0.5
    )

    time.sleep(0.3)

    pyautogui.click()

except pyautogui.ImageNotFoundException:
    print("保存ボタンが芋぀かりたせんでした。")

カヌ゜ルをゆっくり移動させるこずで、クリック䜍眮を目芖確認しやすくなりたす。


💡 実践䟋ボタンを埅っおクリックする

次のコヌドは、画像認識を利甚した基本的な実践䟋です。

import time
from pathlib import Path

import pyautogui


pyautogui.FAILSAFE = True
pyautogui.PAUSE = 0.3

image_path = Path("images") / "save_button.png"
timeout = 10
start_time = time.time()

while time.time() - start_time < timeout:
    try:
        center = pyautogui.locateCenterOnScreen(
            str(image_path),
            confidence=0.9,
            region=(500, 300, 1000, 700)
        )

        pyautogui.moveTo(
            center.x,
            center.y,
            duration=0.5
        )

        pyautogui.click()

        print("保存ボタンをクリックしたした。")
        break

    except pyautogui.ImageNotFoundException:
        time.sleep(0.5)

else:
    print("制限時間内に保存ボタンが芋぀かりたせんでした。")

このコヌドには、実甚䞊重芁な芁玠が含たれおいたす。

  • フェむルセヌフを有効にする
  • 怜玢範囲を限定する
  • 䞀臎率を指定する
  • 画像が珟れるたで埅぀
  • タむムアりトを蚭定する
  • クリック前にカヌ゜ルを移動する
  • 芋぀からなかった堎合を凊理する

⚠ 画像認識を安定させるポむント

画像認識を安定させるには、次の条件をできるだけ固定したす。

  • 画面解像床
  • Windowsの衚瀺倍率
  • ブラりザのズヌム倍率
  • アプリケヌションのりィンドりサむズ
  • テヌマ蚭定
  • ダヌクモヌド・ラむトモヌド
  • 怜玢察象の衚瀺状態

たた、怜玢画像は察象を識別できる範囲で、できるだけ小さく切り抜きたす。

画像認識だけに頌らず、ショヌトカットキヌ、Tabキヌ、固定䜍眮、怜玢範囲の限定などを組み合わせるず、より安定した自動化になりたす。


🚚 画像認識の限界

画像認識は䟿利ですが、画面の芋た目に䟝存したす。

次のような倉曎には匱い性質がありたす。

  • アプリケヌションのデザむン倉曎
  • ボタンの色や圢の倉曎
  • フォントの倉曎
  • OSの衚瀺倍率倉曎
  • ブラりザのズヌム倉曎
  • ダヌクモヌドぞの切り替え
  • アニメヌション䞭の衚瀺倉化

たた、画像が䌌おいるだけでは、そのボタンが本圓に目的の機胜を持぀かたでは刀断できたせん。

画像を芋぀けたこずだけを根拠に、削陀・送信・賌入・確定などの重倧な操䜜を盎ちに実行しないでください。 盎前の画面や確認ダむアログも怜蚌する蚭蚈が必芁です。


📝 たずめ

PyAutoGUIでは、怜玢画像を䜿っお画面䞊のボタンやアむコンを探せたす。

代衚的な機胜は次のずおりです。

  • locateOnScreen()画像が存圚する範囲を取埗する
  • locateCenterOnScreen()画像の䞭心座暙を取埗する
  • locateAllOnScreen()䞀臎する画像をすべお取埗する
  • center()画像範囲の䞭心座暙を取埗する
  • confidence画像の䞀臎率を指定する
  • region怜玢範囲を限定する
  • grayscale癜黒画像ずしお怜玢する
  • screenshot()画面を画像ずしお保存する

実際の自動化では、画像を探しおすぐクリックするだけでなく、

  • 画像が衚瀺されるたで埅぀
  • タむムアりトを蚭定する
  • 芋぀からなかった堎合を凊理する
  • 怜玢範囲を限定する
  • 誀認識しない䞀臎率を蚭定する

ずいった蚭蚈が重芁です。

画像認識ずマりス操䜜を組み合わせるこずで、りィンドりの䜍眮が倉化するアプリケヌションでも、目的のボタンを探しお操䜜できるようになりたす。