【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ほしいものリスト

☆---------------------------------------------------------------------------------☆

この記事が気に入ったらサポートをしてみませんか?