質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PyAutoGUI

PyAutoGUIは、Windows、Mac OS、Linuxに対応した、Python用のGUI自動化ライブラリです。

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

0回答

935閲覧

pyautoGUIで行う画像認識部分の処理の実行速度を上げたい(もしくは画像認識とキー押下の処理を特定時間内で終わるように時間短縮したい)

H.K2

総合スコア88

PyAutoGUI

PyAutoGUIは、Windows、Mac OS、Linuxに対応した、Python用のGUI自動化ライブラリです。

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2022/04/29 05:08

編集2022/05/02 09:07

前提

前回、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問