【Python】AndroidをPC経由で自動化 画像認識を使って楽をしよう!
こちゃてすです。今回はPythonを使ってAndroidを自動化してみました!
何ができるのか
Androidの操作を自動で動かすことができるので、ゲームアプリのクエストなどを自動で周回させたりなどができます!
※ゲームによっては規約違反となる可能性があります。使用する際は自己責任でお願いします。
導入についてはこちら
クラスを作って制作していく
Python初心者なので、良いやり方かはわかりませんが、クラスを使うと変数が扱いやすくなるので、おすすめです!
イメージはこんな感じです。
#必要なモジュールはインポートしておく
adbpath = './platform-tools/'
template_path = './Template/'
class Kocha_android():
def __init__(self):
#システム設定
self.aapo = am.AapoManager(adbpath)
self.template_path = template_path
self.do()
def do(self):
#ここに処理
#Androidの画面を画像として保存する関数(.png)
def screen_capture(self,path=''):
# 画面の読み込み
self.aapo.screencap()
if path == '':
# 現在の日時でキャプチャ画像を保存
self.aapo.imgSave(self.template_path + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.png')
else:
self.aapo.imgSave(path + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.png')
if __name__ == '__main__':
Kocha_android()
Poke-Controllerの画像認識のノウハウを生かす
別記事の内容となりますが、画像認識を使ってNintendo Switchを動かすプロジェクトも行っています。今回はそのノウハウも少し取り入れてみました。
画像認識の関数を流用し、今回の環境に合うようにカスタマイズしました!
def isContainTemplate_android(self,path='', search_range=[0,2520,0,1080], threshold=0.85, use_gray=True, show_value=True,touch=False):
#search_range:[ymin,ymax,xmin,xmax]
self.aapo.screencap()
src = self.aapo.adbl.screenImg
#byte形式の画像データをカラーで画像に復元させる
src = cv2.imdecode(numpy.frombuffer(src, numpy.uint8), 1)
src = src[search_range[0]:search_range[1],search_range[2]:search_range[3]]
src = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) if use_gray else src
if path == '':
print('画像が指定されていません')
return False
#テンプレートのパスは英語表記のみ(重要)
template = cv2.imread(self.template_path + path, cv2.IMREAD_GRAYSCALE if use_gray else cv2.IMREAD_COLOR)
w, h = template.shape[1], template.shape[0]
method = cv2.TM_CCOEFF_NORMED
res = cv2.matchTemplate(src, template, method)
_, max_val, _, max_loc = cv2.minMaxLoc(res)
if show_value:
if max_val > 0.4:
print(path + ' value: ' + str(round(max_val,3)))
if max_val > threshold:
if use_gray:
src = cv2.cvtColor(src, cv2.COLOR_GRAY2BGR)
top_left = max_loc
#bottom_right = (top_left[0] + w, top_left[1] + h)
#print(top_left[0]+search_range[2]+w/2,top_left[1]+search_range[0]+h/2)
out_x = top_left[0]+search_range[2]+w/2
out_y = top_left[1]+search_range[0]+h/2
if touch == True:
self.aapo.touchPos(out_x, out_y)
return True,out_x,out_y
else:
return False
主な関数オプション
・search_range:画像認識処理の範囲設定
・threshold:認識閾値設定
・use_gray:認識を白黒画像で行う(処理が早い)
・show_value:認識結果を少数として出力
・touch:認識した画像の中央をタップ
おすすめの参考記事
おわりに
今回は以上です。ありがとうございました。
Androidの自動化、夢しかないのでこれからいろいろ試して行きたいと思います!
☆---------------------------------------------------------------------------------☆
お問い合わせはTwitterのDMまで
https://twitter.com/kochatece12
こちゃてすプログラム置き場
(ポケモン剣盾、モンハンライズのプログラムを配布しています!)
Amazonほしいものリスト
☆---------------------------------------------------------------------------------☆