バナーナナブログ

宮城県仙台市より、日々思ったことを綴っていくウェブログです。

Switchで自動操作+画像処理+OCRを駆使して、ポケモン剣盾の孵化作業をリッチに行う。

はじめに

以前の記事でラズパイでSwitchを自動操作する記事を書きましたが

smdbanana.hatenablog.com

表題の通り、画像処理+OCRを駆使したリポジトリを作成したのでまとめておきます。

リポジトリは以下です

github.com

 README.mdにも書かせてもらいましたが、偉大なのは

の2つであり、私のリポジトリは亜種です。おまけみたいなもんです。

「画像処理」「OCR」に必要なライブラリ等をインストールすればこのリポジトリを活用できます。

$ sudo apt install python3-dev python3-pip python3-setuptools
$ sudo apt install libopencv-dev opencv-data
$ sudo python3 -m pip install opencv-python
$ sudo apt install tesseract-ocr libtesseract-dev libleptonica-dev pkg-config
$ sudo python3 -m pip install tesserocr
$ sudo wget https://github.com/tesseract-ocr/tessdata_best/raw/master/jpn.traineddata -O /usr/share/tesseract-ocr/4.00/tessdata/jpn.traineddata
$ sudo wget https://github.com/tesseract-ocr/tessdata_best/raw/master/jpn_vert.traineddata -O /usr/share/tesseract-ocr/4.00/tessdata/jpn_vert.traineddata

プロジェクトのcloneは以下

$ git clone https://github.com/smd877/switch-auto-pokemon.git ~/switch-auto-pokemon

あと、処理の中で通知用にSlackのチャット送信を活用しています。
これも以前記事にしています。

smdbanana.hatenablog.com

以下も事前に実施しておきます。

$ sudo vi /etc/environment

// 末尾に以下追加
POST_SLACK_TOKEN_ID=取得したアクセストーク
POST_SLACK_CHANNEL_ID=送信先のチャンネルID

使い方

$ cd ~/switch-auto-pokemon/hatch-eggs/
$ sudo joycontrol-pluginloader -r <Mac address> HatchEggsOCR.py -p 孵化試行回数 個体値リスト 特性確認 色違い確認

4つのオプションの使い方については後ほど説明します。

リポジトリの構造

現在のリポジトリ内の構成は以下のようになっています。

switch-auto-pokemon/
  README.md
  README_HatchEggsOCR.md
  common/
    CustomCommon.py
  hatch-eggs/
    HatchEggsOCR.py
    hatch_msg.jpg
    shiny_mark.jpg

それぞれの役割を説明。

  • README.md / README_HatchEggsOCR.md
    このリポジトリ全体の説明と、孵化作業自動化処理の説明。
  • hatch_msg.jpg
    タマゴが孵ったときに出てくるメッセージの画像。これを画像処理で検知する。

    f:id:smdbanana:20210202162748j:plain

  • shiny_mark.jpg
    孵化したポケモンが色違いかどうかを検知するための画像。画像処理で検知する。

    f:id:smdbanana:20210202162847j:plain

  • CustomCommon.py
    共通のコード。画像処理、OCR、Slackメッセージ送信の他に時渡りの処理等共通で使いそうな記述をまとめておく。
  • HatchEggsOCR.py
    孵化作業自動化の処理コード。

ソース解説

いくつか抜き出して説明します。

__init__関数

主にオプションを変数に組み込む処理と比較用の画像を変数に組み込む処理を行います。
使い方でHatchEggsOCR.pyのディレクトリに移動しているのは画像読み込みのパス指定を楽チンにするためです。
オプションについては以下の感じ。

  • 第1引数 孵化試行回数
    孵化の試行回数を数値で指定 1000以下
  • 第2引数 個体値リスト
    v-x-v-v-v-0 こんな感じで v (さいこう), 0 (ダメかも), x (チェックしない) を組み合わせる
  • 第3引数 特性確認
    特性を限定したいときに記述 または any と指定すればチェックしません
  • 第4引数 色違い確認
    色違いの指定を指示 want (他条件とOR), must (他条件とAND), any (チェックしない)

サンプルで、「特性びびり」で「C抜け5V」のコイキングをターゲットとしたい場合は以下のように指定します。
(試行回数は50匹まで、色違いはwantで対象だったら中断する。)

$ sudo joycontrol-pluginloader -r <Mac address> HatchEggsOCR.py -p 50 v-v-v-x-v-v びびり want

とにかく色違いを確認したい、という場合は以下のように指定します。

$ sudo joycontrol-pluginloader -r <Mac address> HatchEggsOCR.py -p 1000 x-x-x-x-x-x any must

run関数

メインの処理。
私が持っているhdmiスプリッターの問題なのか、キャプチャ開始のタイミングでちらつきが発生し、その間にBluetooth入力を受け付けたり受け付けなかったりするので明示的にwaitをかけています。
試行回数まで孵化作業を繰り返し、5匹孵化するごとにチェック処理をします。
チェックで対象が引っかかれば処理を中断し、最後にSlackで通知をして終了という流れ。

hatch_egg関数

タマゴを受け取ったら画像処理を使って「おや……?」の画像と比較。
サルベージ処理として、グルグルを開始して3分経過しても画像一致しなければ中断するようにしています。

f:id:smdbanana:20210202170950j:plain

↑画像処理で「おや……?」の領域をトリミングしたものを比較に使っている。

check_pokemon関数

ボックスを開いて、手持ちの2匹目をチェックする。
オプション指定した対象にマッチしなければ逃がすし、マッチすれば処理を中断します。

f:id:smdbanana:20210202171313j:plain

↑こんな感じで、色違いの確認は画像比較、それ以外はOCRでチェックしている。

デモ

というわけで、このプログラムを動作させたムービーを撮影してYouTubeにアップしました。


Switchで自動操作+画像処理+OCRを駆使して、ポケモン剣盾の孵化作業をリッチに行う。

ということで、

画像処理+OCRで状況判断することができるので、自動操作の幅が広がりますねー。

 

私からは以上です。