画像認識の解説(剣盾)

事前知識

いくつか事前に知っておくと良い知識を記載しておきます。 詰まった時に一度振り返り確認してもらえると良いと思います。

使用されている言語:Python

Poke-Controllerの開発や操作においては、主にPythonが用いられています。
 
 
Pythonを書く時の最低限の注意点:
・プログラムを書くときは、コメントアウト以外は半角英数を使います。(スペースも必ず半角を使う。) ・Pythonはインデントでプログラムの段落を整理するので、段落を合わせて書きましょう。インデントは、Pythonでは"半角スペース4つ"が一般的でTabキーなどを織り混ぜず統一すると良いです。
 

画像認識/テンプレートマッチング

画像認識とは、画面上にうつされているものをコンピュータが認識・識別することで、判断をさせることをいいます。Poke-Controllerの本家でも画像認識について詳しく説明されています。
 
画像認識とは · KawaSwitch/Poke-Controller Wiki
現在メソッドとして提供している画像認識の機能は次の通りです これから追加予定の主な画像認識の機能は次の通りです これらは順次更新/改良していきます ある画像からテンプレート画像と最も一致する場所を探索する方法です 左上からテンプレート画像を走査していき, 最も類似度が高いと判定される箇所を見つけます 原理や計算式は ここ とかを参考にしてください 本プロジェクトではZNCCで類似度を計算しています ZNCCでは類似度は-1から1の範囲 で出ます(1に近づくほど類似度が高い) 例として次の画像から「どうぐをポケットに しまった」という文言があるかを判定してみます 入力画像 探したい画像(テンプレート画像) ※勝手にリサイズされて表示されますが実際は切り取ったサイズです 実際にテンプレートマッチングで求めると次のようになります 一致と判断した箇所を四角で囲んでいます カラー画像結果 この時の類似度は1.0でした!加工なしですからね 一般的に計算量を減らすためにグレースケール画像で処理を行うことが多いです RGBの3チャンネルで計算するより1チャンネルの方が速いことは明白です グレースケールで試してみました グレースケール画像結果 今回の類似度は0.9995401501655579でした. かなりの精度ですね ただしグレースケールでは色の情報が失われるので, 色違いなどの判定の際にはカラーで行います PokeController/SerialController/TestImageRecognition.py のisContainTemplateメソッドで好きな画像で試すことができます テンプレート画像がマッチングするか不安な場合や確認したいときは活用してください 動体を検知する手法の1つで, 複数枚のフレーム間画像の差分から動いている部分を検出します より詳しくは ここ とかを参照してください 本プロジェクトではフレーム画像から差分画像を取得し2値化処理を行う方法を採っています 膨張処理は加えていません また現在は認識としての機能は考えていません メニュー画面で輝度値(グレースケールでの色の濃さ)のフレーム間差分を見てみます メニュー画面の輝度差分画像 矢印部分だけが切り取れていることが分かりますね!
 
画像認識と一口に言っても実は、画像を認識させたり、文字を認識させたり、特定の物体を検知させたりと様々な方法が用いられます。Poke-Controllerのプログラムでは特に「テンプレートマッチング」が用いられます。
テンプレートマッチングは、準備した画像と、現在の画面上を比較し、「どれだけ一致しているか」をみて動作を決定させます。
 

コードエディタのダウンロード

必須ではないのですが、コードを書き換えたり編集したりする時に見やすくするために、コードのエディターを用いるとより便利になります。
普段使用しているものでおすすめは、「Visual Studio Code」です。
 

画像認識の挙動確認

画像認識を用いたプログラムは、「Poke-Controller/SerialController/Commands/PythonCommands/ImageProcessingOnly/」の中にいれることになっています。
 

①IMG_Check.pyのダウンロード

下記のリンクよりIMG_Check.pyをダウンロードします。
このプログラムは、「左下のYY通信のマークを画像認識する」というものになっています。認識対象のYY通信の画像はデフォルトでPoke-Controllerに入っているものです。
※IMG_Check.pyのアップするファイルが間違っていたので更新しました。(2021.7.29 18:20)
 

② フォルダ内へファイルを移動します。

" Poke-Controller/SerialController/Commands/PythonCommands/ImageProcessingOnly/IMG_Check.py " という位置にファイルを移動させます。
 
 

③リロード

ファイルを移動させた後に、Command欄の「Reload」をクリックします。
 

④実行してみる

オフラインマークが出ている画面が表示されるようにし、CommandをIMG_Checkにし、「Start」をクリックします。
 

⑤結果を読む

数値はここの環境によって異なる場合がありますが、上記のように結果が得られるはずです。
 
返されている結果から以下の情報を得ることができます。
1. Start IMG_Check:プログラムをはじめます。
2. "Network_Offline.png" の画像の一致率を調べました。
3. ZNCC 0.9427657723426819 → 一致率は94.27...%でした。
4. True → 結果は "正" でした。
5. Check_END:チェックを終わりました。
 
特に、3の一致率が著しく低い場合は、キャプチャーボードなどの設定側での問題が発生している場合があります。その場合は、「よくあるトラブル」の内容をご確認ください。
 

よくあるトラブル

1.解像度の設定が違う
Poke-Controllerでは、1280*720の画像を使用しています。キャプチャボードの入力の仕方やSwitch側の設定で解像度が違う場合は、正しく判定できません。
解像度のチェックはPoke-Controllerで「Capture」をし、
"Poke-Controller/SerialController/Capture/"
内のキャプチャーした画像をプロパティから見てみると解像度が分かるでしょう。
 
2.画面が全体表示されていない
Poke-Controllerに表示されている画像が全画面表示でない場合は、正しく認識されません。縮小されて周りに黒い帯が出る場合は画像認識が正しく作動しない場合があります。「Switch本体設定の出力(設定>テレビ出力>画面の大きさ)」「キャプチャーボードの設定」の2箇所をチェックし、100%で表示されるように設定してください。(下記の画像のようなイメージです。)
 

 
上記の内容は、下記のnoteより動作確認の部分のみを移行してます。