前提
前回、PyAutoGUIで、画像認識を行って、それに対応する矢印キーを押下する処理について質問させていただきました。
https://teratail.com/questions/rociee892e3sb6#reply-urv3i6kbut33d0
実現したいこと
下記の①~④の処理のループを2秒以内で回したいです。
①矢印の認識を行う(現状、1.2秒~1.3秒かかる)
→②pyautoGUIで、ウェイトをかけながら、認識した矢印に対応するキーボードを押下する
(各キー押下ごとに0.1秒くらいないと誤操作するので、time.sleepを入れています。)
→③リストに入った矢印をすべて押し切ったら、ウェイトする
(画面切り替えの関係で0.5秒くらい待たないと、適切なリストが取得できません)
→最初に戻る
④①に戻る
現状は、pyautoGUIの処理(locateAllOnScreen)で画像認識を行っていますが、
一つの矢印について複数点(近い部分)が認識されるため、矢印の大きさ(大体30px~50px程度)以内の近さのものは同じ点として省くようにしています。
発生している問題・エラーメッセージ
①~④までの処理は、取得する矢印キーの個数で勿論変わるのですが、矢印は最大9位出ること、
1ループは平均で2秒以内に回す必要があるため、画像認識の速度を上げないと
目的が達成できないことになっています。
そのため、①の画像認識速度を上げたいのですが、どのようにすれば速度向上ができるのか
が分からないため、困っております。
上記の、複数点の間引きをpandasで行っている(それしか実装できなかった)ため、
このあたりにネックがあるようにも思うのですが、一方で並列処理などで①の矢印認識と②、③のキー押下処理をうまく管理するなどの手法が使えないかとも思い、
質問させていただきました。
該当のソースコード
Python3
1# import 2import pyautogui 3import pyperclip 4import win32gui # windowアクティブ用に使用 5import time 6from pathlib import Path 7import pandas as pd 8import datetime 9 10def get_sequence_direction(offset=50): 11 # 画像から、上下左右の向きを順番に取得する。 12 conf = 0.75 13 check_picture_list = [ 14 Path("picture") / Path("maiou_up.png"), 15 Path("picture") / Path("maiou_down.png"), 16 Path("picture") / Path("maiou_left.png"), 17 Path("picture") / Path("maiou_right.png"), 18 ] 19 directions = ["up", "down", "left", "right"] 20 21 tmp_result_list = [] 22 tmp_direction_list = [] 23 sorted_list = [] 24 result_list = [] 25 direction_list = [] 26 result_df = pd.DataFrame([], columns=["x", "direction"]) 27 for pict, direction in zip(check_picture_list, directions): 28 tmp_result_list = list(pyautogui.locateAllOnScreen(str(pict), confidence=conf)) 29 tmp_direction_list = [direction]*len(tmp_result_list) 30 x_list = [] 31 y_list = [] 32 for pict_c in tmp_result_list: 33 center = pyautogui.center(pict_c) 34 x_list.append(center.x) 35 y_list.append(center.y) 36 37 df = pd.DataFrame(zip(x_list, y_list, tmp_direction_list), columns=["x", "y", "direction"]) 38 dfsort = df.sort_values(by="x") 39 dfsort = dfsort[(dfsort.x - dfsort.shift().fillna(0).x) > offset].copy() 40 result_df = pd.concat([dfsort, result_df]) 41 42 return result_df.sort_values(by="x")["direction"].tolist() 43 44# メイン処理 45pyautogui.keyDown("shift") 46up_center = pyautogui.locateCenterOnScreen(str(Path("picture") / Path("maiou_push_up.png")), confidence=0.75) 47down_center = pyautogui.locateCenterOnScreen(str(Path("picture") / Path("maiou_push_down.png")), confidence=0.75) 48left_center = pyautogui.locateCenterOnScreen(str(Path("picture") / Path("maiou_push_left.png")), confidence=0.75) 49right_center = pyautogui.locateCenterOnScreen(str(Path("picture") / Path("maiou_push_right.png")), confidence=0.75) 50print(f"up:{up_center}, down:{down_center}, left:{left_center}, right:{right_center}") 51select_dir_dict ={ 52 "up": up_center, 53 "down": down_center, 54 "left": left_center, 55 "right": right_center 56} 57count = 0 58COUNT_END = 100 59# ループ部分 COUNT_ENDになるまで、矢印キーリストの取得、対応キー押下を行う。 60while(True): 61 count = count + 1 62 dir_list = get_sequence_direction(30) 63 for dir in dir_list: 64 pyautogui.press(dir) 65 time.sleep(0.09) 66 time.sleep(0.4) 67 if count > COUNT_END: 68 break 69 70pyautogui.keyUp("SHIFT") 71
試したこと
速度を上げる方法について調査した。
補足情報(FW/ツールのバージョンなど)
python 3.9.6
pandas 1.3.0
PyAutoGUI 0.9.53
あなたの回答
tips
プレビュー