Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Pythonを用いて画像認識で操作を自動化してみる

先日から操作の自動化方法について調べて試してみたりしています。
elsammit-beginnerblg.hatenablog.com
elsammit-beginnerblg.hatenablog.com

今回はあらかじめ用意した画像を認識し、画像を手掛かりに操作を自動化する方法についてまとめていきます。
今回も用いるライブラリはPyAutoGUIです。

自動操作を行う上でPyAutoGUIは便利ですね。



■環境構築

今回はwindowsを用いてみたいと思います。
windowsでも同様に、

pip install pyautogui

でインストールが行えました。
合わせてPythonのバージョンですが、
Python 3.7.4
を用います。

■画像認識を組み合わせて操作を自動化

では早速画像認識を組み合わせて操作を自動化してみたいと思います。
自動化する手順ですが、
vscodeを起動→新しいファイルを生成→任意の文字列を入力→ファイルを保存
とします。

コードはこちら。

import pyautogui
import time

#vscodeを起動
pyautogui.press('win')
pyautogui.write('vscode')
time.sleep(0.5)
pyautogui.press('enter')

#vscode上で新しいファイルを生成
while pyautogui.locateOnScreen('vscode.png', confidence=0.9) is None:
    time.sleep(1)
pos = pyautogui.locateOnScreen('vscode.png', confidence=0.9)
pyautogui.click(pos)

#任意の文字を入力
pyautogui.write('hogehoge')

#保存ショートカットキー実行
pyautogui.hotkey('ctrl','s')

#保存ボタンを押下
while pyautogui.locateOnScreen('resister.png', confidence=0.9) is None:
    time.sleep(1)
pos = pyautogui.locateOnScreen('resister.png', confidence=0.9)
pyautogui.click(pos)

ここで、認識させた画像ですが、
vscode上で新しいファイルを生成するためのこちらの画像と、
f:id:Elsammit:20210922224932p:plain
※画像ファイル名:vscode.png

保存時に保存ボタンをクリックするためのこちらの画像を用いました。
f:id:Elsammit:20210922225054p:plain
※画像ファイル名:resister.png

どちらもwindowの開く位置に応じて座標がズレるため、画像により座標の位置を取得しています。
画像の座標位置の取得ですがこちらのコードでそれぞれ取得しています。

while pyautogui.locateOnScreen('画像ファイル名', confidence=0.9) is None:
    time.sleep(1)
pos = pyautogui.locateOnScreen('画像ファイル名, confidence=0.9)

まず、

while pyautogui.locateOnScreen('画像ファイル名', confidence=0.9) is None:
    time.sleep(1)

で画面上に画像が含まれているかをチェックし、見つかるまで1秒間隔でループします。
画像の部分が見つかり次第、

pos = pyautogui.locateOnScreen('画像ファイル名, confidence=0.9)

にてposに画像の位置を代入します。

ここで、confidenceは画像との一致率を示しています。
confidenceを1に近づけると完全一致に近づきます。
1を指定してしまうとディスプレイに画像領域が存在しても反応してくれないことが多々発生します。
体感で、0.8~0.9の間にするとよさそう。
こちらは、使用環境によりばらつくところになるのでチューニングしてみて下さい。

後は前回のブログで書いた通り、キーボード操作を駆使して自動操作を行っています(前回と重複するので細かい解説は省略します)
※前回のブログは下記です。
elsammit-beginnerblg.hatenablog.com

こちらのコードを実行してみてください。
恐らく、エディタの立ち上げから新規ファイルが開き、hogehogeという文字が入力されたファイルが保存されるかと思います。

■画像認識を用いてディスプレイ上の操作が正しいかチェック

locateOnScreenによる画像認識は自動操作と合わせて正しい画像が出ているかチェックできそうだな。
と感じております。
画像認識のみを実行したクイズ形式のコードを載せます。

import pyautogui
import time

print("Question1")
while pyautogui.locateOnScreen('vscode.png', confidence=0.9) is None:
    time.sleep(1)
    print("Q1 NG")
print("Q1 OK")
print("=============================")
print("Question2")
while pyautogui.locateOnScreen('newPage.png', confidence=0.9) is None:
    time.sleep(1)
    print("Q2 NG")
print("Q2 OK")
print("=============================")
print("Question3")
while pyautogui.locateOnScreen('resister.png', confidence=0.9) is None:
    time.sleep(1)
    print("Q3 NG")
print("Q3 OK")

こちらのコードは先ほどのvs codeを開いて新しいファイルを作成するまでの手順をクイズ形式に並べたコードになります。
Question1では、vs codeが正しく開けたかを先ほどのvscode.pngを用いてチェック。
Question2では、vs code上で新しいファイルが開けたかをチェック。

最後にQuestion3では、保存を行うための画面が開けているかを、
resister.pngでチェックしています。

こちらのような画像認識していくコード結構有用だと思っているんですよね。
なぜか??

GUI画面の遷移確認が比較的簡単に自動化できそうなんですよね。
内部的な制御であれば、分岐処理が正しく通っているかをinとoutをチェックしていくことがメインになるので自動化コードは簡単なのですが、
GUIだと正しい画面が表示されているか確認が必要ですね。
このGUI画面の確認の一部を肩代わりできるかな?と考えています。

例えば、
画面Aの次には画面Bが表示され、さらに次は画面C、、
と続く場合、画面B、画面Cの特徴的な部分を切り出して、
実際に自動的に画面遷移を実施しながら切り出した画像に対して、
locateOnScreenを実行していけば成否判断出来てしまいますよね。

もちろん、最後は人間の目で見て確認は必須となりますが、
コード修正の過程ではこちらの自動化を用いるなどすることで負荷は軽減できそうです。

■注意点?
自分の環境ではデュアルモニタを用いているのですが、メインモニタでのみ反応していました。
セカンドモニタでは反応しない?
もう少し調べる必要がありそう。

■最後に

今回は画像認識で操作を自動化するためのサンプルをご紹介しました。
こちらも結構便利なので折を見て使用していくかと思います。
とりあえず、画像認識だけでも評価に使用できそうなので導入してみようかな?