
Poke-Controller③画像認識ことはじめ
最新情報について
最新情報は今後以下のPoke-Controller Guideにまとめていくので、導入方法など含め、こちらのサイトを優先してご覧ください。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
前回の記事に引き続き、Poke-Controllerが起動できるようになったところから進めていきます。前回までの流れは、Poke-Controller編の1~2.2まで読んでもらえると良いと思います。
この記事では、"画像認識の仕組みを解説しつつ、プログラムが動かない場合の対処を学ぶ" ことを目標に解説していきます。
使用されている言語:Python
Poke-Controllerの開発や操作においては、主にPythonが用いられています。本記事においては、Poke-Controllerの操作において必要な点に絞って説明を進めていきます。
Pythonを書く時の最低限の注意点:
・プログラムを書くときは、コメントアウト以外は半角英数を使います。(スペースも必ず半角を使う。)
・Pythonはインデントでプログラムの段落を整理するので、段落を合わせて書きましょう。インデントは、Pythonでは"半角スペース4つ"が一般的でTabキーなどを織り混ぜず統一すると良いです。
画像認識/テンプレートマッチング
画像認識とは、画面上にうつされているものをコンピュータが認識・識別することで、判断をさせることをいいます。Poke-Controllerの本家でも画像認識について詳しく説明されています。
画像認識と一口に言っても実は、画像を認識させたり、文字を認識させたり、特定の物体を検知させたりと様々な方法が用いられます。Poke-Controllerのプログラムでは特に「テンプレートマッチング」が用いられます。
テンプレートマッチングは、準備した画像と、現在の画面上を比較し、「どれだけ一致しているか」をみて動作を決定させます。
1.コードエディタのダウンロード
必須ではないのですが、コードを書き換えたり編集したりする時に見やすくするために、コードのエディターを用いるとより便利になります。
普段使用しているものでおすすめは、「Visual Studio Code」です。
2.画像認識の挙動を確認するプログラムの導入
画像認識を用いたプログラムは、「Poke-Controller/SerialController/Commands/PythonCommands/ImageProcessingOnly/」の中にいれることになっています。
(前回の記事より、GitHubからダウンロードを進めていた方は、下記の①-③は不要です。)
① IMG_Check.pyのダウンロード
下記のリンクよりIMG_Check.pyをダウンロードします。
② フォルダ内へファイルを移動します。
" Poke-Controller/SerialController/Commands/PythonCommands/ImageProcessingOnly/IMG_Check.py " という位置にファイルを移動させます。
③ リロード
ファイルを移動させた後に、Command欄の「Reload」をクリックします。
3.実行してみる
オフラインマークが出ている画面が表示されるようにし、CommandをIMG_Checkにし、「Start」をクリックします。
4.結果の読み方
Start IMG_Check
Network_Offline.png ZNCC value: 0.9427657723426819
True
Check_END
上記のような結果が得られるはずです。
1. Start IMG_Check:プログラムをはじめます。
2. "Network_Offline.png" の画像の一致率を調べました。
3. ZNCC 0.9427657723426819 → 一致率は94.27...%でした。
4. True → 結果は "正" でした。
5. Check_END:チェックを終わりました。
5.プログラムの説明
関係しているところのプログラムを一部抜粋しました。
if self.isContainTemplate('Network_Offline.png',threshold=0.9, use_gray=False, show_value=True):
#----.png -> 判定したいファイル名を入れる
#threshold=0.9 ->0.9以上の時True
#use_gray=True ->白黒画像で判定 / use_gray=False ->カラーで判定
#show_value=True ->判定時の数値を表示する / show_value=True ->判定時の数値を表示しない
print("True")
print("Check_END")
# の部分はコメントアウトといって、
# がついている行は、説明用の行なのでプログラムに関連しません。という意味です。
つまり、画像認識に関連しているところは、この3行のみになります。
if self.isContainTemplate('Network_Offline.png',threshold=0.9, use_gray=False, show_value=True):
print("True")
print("Check_END")
このプログラムは、「"Network_Offline.png"が閾値0.9、カラーで判定し、その際の一致率を表示します。もし一致率が、0.9以上の時は"True"を返します。終了時に"Check_END"を出力します。」ということが書かれています。
※一致しない時には、Falseを返すようにすればよかったのですが、簡単なチェック用で作ったので、Trueが返ってくるかどうかで判断してください。
5.コードの編集
コードの編集は、「IMG_Check.py」をVisual Studio Codeで開いて編集すると良いでしょう。(下記画像は、別のファイル名でチェックしている様子です)
①閾値の変更(threshold)
閾値は画像が一致しているかどうかを判定する基準の数値になります。
threshold=0.9 の値を下げると一致しているという条件が低くなるので、一致かどうかの判定が甘くなります。数値が高ければ高いほど厳しい判定になります。
閾値の設定は、甘くしすぎると誤判定が発生する可能性があるので、数値を見ながら決めると良いと思います。
②画像の差し替え(---.png)
認識する画像の差し替えは、"Poke-Controller/SerialController/Template/" 内にあるファイルを用いることができます。
例えば、"shiny_mark.png" は、色違いの横につくマークなので、試しにファイル名を書き換えてチェックしてみると良いと思います。
③モノクロ画像かカラー画像か(use_gray=True/False)
画像判定にカラーを用いるか、モノクロを用いるかをTrue/Falseで設定を変えることができます。モノクロで判定する方が処理が軽く、カラーの方が精度は上がるが処理が多少重くなるはず...。
④一致率を表示するか(show_value=True/False)
一致率を見たたいときは、Trueで、表示させたくないときはFalseにすると良いでしょう。この欄は表示しなくても良いですが、閾値設定の時は Trueにしておくと良いでしょう。
良くあるトラブル
1.解像度の設定が違う
Poke-Controllerでは、1280*720の画像を使用しています。キャプチャボードの入力の仕方やSwitch側の設定で解像度が違う場合は、正しく判定できません。
解像度のチェックはPoke-Controllerで「Capture」をし、"Poke-Controller/SerialController/Capture/" 内のキャプチャーした画像をプロパティから見てみると解像度が分かるでしょう。
2.画面が全体表示されていない
Poke-Controllerに表示されている画像が全画面表示でない場合は、正しく認識されません。縮小されて周りに黒い帯が出る場合は画像認識が正しく作動しない場合があります。「Switch本体設定の出力(設定>テレビ出力>画面の大きさ)」「キャプチャーボードの設定」の2箇所をチェックし、100%で表示されるように設定してください。(下記の画像のようなイメージです。)
おわりに
Poke-Controllerの画像認識の動作の確認方法と簡易的な調整に関してまとめました。自分用のプログラムの調整に参考にしてもらえたらと思います。今回はPythonの記法については触れていませんが、合間を見ながら基本的な書き方なども紹介できたらと思っています。
この記事が参考になったら、Twitterのフォロー、noteのスキなど是非お願いします!めーっちゃ助かった!って方は、サポートも是非!
Twitter: https://twitter.com/junky_poke_
ウィッシュリストも作ってみました。もしよければ...!!!
https://www.amazon.jp/hz/wishlist/ls/2L4LJ6N4M4YE4?ref_=wl_share
気軽にクリエイターの支援と、記事のオススメができます!