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

Uncategorized
694 words

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

はじめに

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

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

https://github.com/noitaro/opencv-tsumtsum

必須ライブラリ

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

1
2
3
4
pip install pywin32
pip install keyboard
pip install pyautogui
pip install opencv-python

ツムをなぞる処理

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# タップ開始
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で実行するとちょういい感じになります。

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

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

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

おわりに

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

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