【OpenCV】ツムを判別する方法 FINAL

アプリ開発

今回でいったん区切りをつけたいと思います。GWも終わるし、何より雲行きがあやしくなってきたのが大きいです。

はじめに

まず簡単に現状報告です。前回 色分けが出来たので、今回ルート検索を実装しました。ルート検索は、まあいい感じに無難なのが出来たのでよかったんですが、前回の色分けが悪くて動作に難が出てきちゃいました。

とりあえず、ルート検索まで実装したソースを GitHub に上げておきます。

noitaro/opencv-tsumtsum
Contribute to noitaro/opencv-tsumtsum development by creating an account on GitHub.

必須ライブラリ

下記ライブラリを使っています。

pip install pywin32
pip install keyboard
pip install pyautogui
pip install opencv-python

ツムをなぞる処理

WIN32APIを使ってマウスカーソルを操作しているので、バックグラウンドで回すことができません。

一度、adbシェルの sendevent を使って実装したんですが、速度が出なかったのでやめました。

# タップ開始
cmd = "sendevent %s %s %s %s;" % ('/dev/input/event5', 3, 53 , pos[0]) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 3, 54 , pos[1]) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 3, 58 , 10 ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 3, 57 , 0  ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 0, 2  , 0  ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 1, 330, 1  ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 0, 0  , 0  )
subprocess.run('adb -s ' + self.device + ' shell \"' + cmd + '\"', shell=True)

# ツムをなぞる
cmd = "sendevent %s %s %s %s;" % ('/dev/input/event5', 3, 53 , pos[0]) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 3, 54 , pos[1]) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 3, 58 , 10 ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 3, 57 , 0  ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 3, 50 , 0  ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 3, 51 , 0  ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 0, 2  , 0  ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 0, 0  , 0  )
subprocess.run('adb -s ' + self.device + ' shell \"' + cmd + '\"', shell=True)

# タップ終了
cmd = "sendevent %s %s %s %s;" % ('/dev/input/event5', 0, 2  , 0  ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 1, 330, 0  ) + \
      "sendevent %s %s %s %s;" % ('/dev/input/event5', 0, 0  , 0  )
subprocess.run('adb -s ' + self.device + ' shell \"' + cmd + '\"', shell=True)

アンドロイド画面の取得

scrcpy を使ってアンドロイドの画面をPCモニターに出力して、PCのスクリーンショットを撮って使うようにしました。

scrcpy を x=0、y=0 の位置に表示させて 幅を500pxで実行するとちょういい感じになります。

scrcpy.exe --window-x 0 --window-y 0 --window-width 500

PCのスクリーンショットは簡単に撮れました。そのまま OpenCV に渡せる。

imgArray = pyautogui.screenshot(region=(0,0,500,888))

おわりに

アルゴリズムは出来たので、あとはツムの判別をどうするかですかね。色だけだとどうしても判別しきれませんでした。

機械学習で学習させて判別できるように、今後対応してみようと思います。

タイトルとURLをコピーしました