「PyAutoGUIの画像認識でエラーが出る」
「PyAutoGUIを使った画像認識の精度が悪い・・・」
「PyAutoGUIによる画像認識の処理速度が遅い」
このような場合には、この記事の内容が役に立ちます。
この記事では、PyAutoGUIによる画像認識について解説しています。
本記事の内容
- PyAutoGUIによる画像認識の仕組み
- PyAutoGUIによる画像認識の精度を上げる
それでは、上記に沿って解説していきます。
PyAutoGUIによる画像認識の仕組み
PyAutoGUIによる画像認識の仕組みを理解しておきましょう。
基本的には、PyAutoGUIではデスクトップの画面全体が対象になります。
そして、そのデスクトップ上の座標をもとに操作を行います。
操作とは、クリックであったり、スクリーンショットの撮影であったりします。
ここまでは、大丈夫ですね?
この状況において、次のボタンをクリックすることを考えましょう。
サイズは、横27px・縦21pxとなります。
close.png
ごくごく普通の閉じるボタンです。
アイコンとも言いますが、ここではボタンと呼びます。
そして、デスクトップ上は次のような状況だとします。
閉じるボタンが、3つ存在しています。
この時、PyAutoGUIでは次のように画像を認識できています。
Box(left=1525, top=68, width=27, height=21) Box(left=1863, top=136, width=27, height=21) Box(left=1631, top=255, width=27, height=21)
結果を見ると、上から(top=0)サーチしているようです。
上記情報は、次のコードで表示しています。
import pyautogui for pos in pyautogui.locateAllOnScreen("close.png"): print(pos)
認識できた画像の情報をすべて表示するコードです。
今回は、わかりやすい画像のため3つすべてが認識できています。
ただ、close.pngは計算機(left=1863, top=136)における閉じるボタンの画像です。
この場合、「locateOnScreen」を用いると先頭の閉じるボタンが選択されます。
import pyautogui p = pyautogui.locateOnScreen("close.png") if p: x, y = pyautogui.center(p) print(p)
上記を実行した結果は、以下。
Box(left=1525, top=56, width=27, height=21)
なお、locateOnScreenについては次の記事で解説しています。
そうなると、どうやって計算機の閉じるボタンを選択すればよいのでしょうか?
言い換えると、画像認識の精度をどうやって上げることができるのでしょうか?
以下では、画像認識の精度を上げる方法を説明します。
PyAutoGUIによる画像認識の精度を上げる
結論から言うと、範囲を絞ることで精度を上げます。
サーチする範囲を限定するのです。
そうすれば、対象以外は無視できます。
今回のケースであれば、計算機以外の閉じるボタンを無視するのです。
範囲を限定することにより、サーチの処理速度を上げることができます。
画面全体をサーチ対象にする必要が、なくなっていますからね。
実は、この効果が結構デカイのです。
そして、そのためのコードが以下。
import pyautogui # 範囲指定 target_range = (1576, 126, 328, 79) p = pyautogui.locateOnScreen("close.png", region=target_range) if p: x, y = pyautogui.center(p) print(p)
上記の実行結果は、以下。
Box(left=1863, top=136, width=27, height=21)
計算機の閉じるボタンを認識できています。
あとは、自動クリックで煮るなり閉じるなりご自由に。
これが実現できたのは、次のコードによります。
# 範囲指定 target_range = (1576, 126, 328, 79) p = pyautogui.locateOnScreen("close.png", region=target_range)
指定した範囲の中で閉じるボタンをサーチしています。
範囲については、ツールを用いて取得しています。
窓フォトというツールを利用すれば、簡単に範囲を取得可能です。
窓フォトについては、次の記事で説明しています。
RPAのような自動処理においては、基本的にはウィンドウ位置は固定が多いはずです。
座標をもとにして処理を行うことが多いですからね。
もし固定でなければ、ウィンドウをサーチして見つけ出します。
今回なら、計算機自体を最初に画像認識します。
その際は、この画像を利用することになるでしょう。
そして、見つけた計算機の座標をもとに「target_range」に設定する値を決めます。
そうすれば、予め「target_range」の値が不明でも対応できるはずです。
とにかく、PyAutoGUIを使えば大抵のことはできるでしょう。
以上、PyAutoGUIによる画像認識の精度を上げる方法を説明しました。