ページ

2024-09-16

【スプラトゥーン3】OBSのプラグインで画像認識してバトル開始/終了を検知する

概要

OBSプラグイン『Advanced Scene Switcher』(日本語名:『高機能シーンスイッチャー』)を使って、スプラトゥーン3のゲーム画面を画像認識してみました。

  • 一定時間ごとに音を鳴らすタイマー(インターバルタイマー)を作る
  • バトル開始を画像認識して、インターバルタイマーを開始する
  • バトル終了を画像認識して、インターバルタイマーを停止する

これらをすべてOBSプラグイン『Advanced Scene Switcher』で作成しました。

インターバルタイマーとは

あらかじめ設定した時間間隔を、アラームで繰り返し知らせてくれるタイマーのことです。

例えば、バトル中に一定間隔で音を鳴らすことで、定期的にイカランプやマップを見る習慣を身につける練習に使うことができます。

Webブラウザで動くものであれば以下のようなものがあります。

https://timer.onl.jp/

ただし、バトル開始と終了に合わせて手動でタイマーをリセットする手間があります。
そこで、バトル開始と終了を検知してタイマーを自動でリセットできないかと考えました。

イカランプの状態を画像認識すればよいのでは?

やろうと思えばできます。しかし、今回はそれが目的ではありません。

理想は、バトル中に画面に表示される情報を読み取って、その情報を元に勝ちにつながる行動をすることです。
イカランプを直接読み取って通知してしまうと、この先ずっと画像認識の補助無しでは戦えなくなります。

最終的には、インターバルタイマーを使わなくてもイカランプに意識が向くことを目指します。

OBSプラグイン『Advanced Scene Switcher』(日本語名:『高機能シーンスイッチャー』)を導入する


主な用途はOBSのシーンを切り替えるものです。
シーンを切り替えるだけでなく、画像認識を条件としたり、外部プログラムを起動したりもできます。

導入方法は以下のページを参考にしました。

【OBS|プラグイン】画像認識してシーンを自動切り替えする|DBD特化[Advance Scene Switcher] - デフゲーマーのVTuber備忘録

インターバルタイマーを作る

好みのインターバルタイマーがあればそれでよいのですが、特にこだわりがなければ Advanced Scene Switcher のマクロで作ると他のマクロと組み合わせるときに便利です。
今回はインターバルタイマーも Advanced Scene Switcher のマクロで作ることにしました。

イベントで条件を設定する


  1. イベント「タイマー」を追加する
  2. 任意の時間を設定する
  3. 「他のマクロと並行してマクロを実行する」を有効にする

アクションで動作を設定する


  1. アクション「Run」を追加する
  2. タイマーで鳴らしたい音声ファイルのパスを設定する

バトル開始を検知する

バトル中の画面上部に表示される残り時間を画像認識して、

  • ガチルール 5:00
  • ナワバリ 3:00
  • トリカラ 3:00

の表示になったらバトル開始とみなすことにします。

画像認識用の画像を用意する

残り時間表示の画像を

  • ガチルール 5:00
  • ナワバリ 3:00
  • トリカラ 3:00

の3パターン用意します。
※トリカラはナワバリとは表示場所が違うため注意


OBSでバトル中のスクリーンショットを撮り、残り時間表示の部分を切り出します。
このとき、切り出した場所の

  • 左上の座標 X, Y
  • 切り出した領域の 幅, 高さ

をメモしておきます。
この値はあとでマクロで使用します。

他人が撮ったスクリーンショットを使用してもよいですが、手持ちのキャプチャーボードの個体差で画像認識結果が変わる可能性がありますので、自作するほうが確実です。

イベントで条件を設定する


以下の手順で、ガチルール/ナワバリ/トリカラの3種類ぶんのイベントを設定します。

  1. イベント「動画」を追加する
  2. 条件を設定する(後述)
  3. 「他のマクロと並行してマクロを実行する」を有効にする

条件

  • matches pattern を選択する
  • 残り時間表示の画像ファイルのパスを設定する

閾値

  • 0.99 ぐらい
  • 認識してほしい場面で反応しなかったり、関係ない場面で反応しすぎる場合は、値を調節する(後述)

エリア内のみチェックを実施


  • 「エリア内のみチェックを実施」を有効にする
  • 残り時間表示の認識エリアを設定する
    • 認識用の画像を切り出したときの X, Y, 幅, 高さ
  • 「範囲指定」ボタンで認識エリアが正しく設定されているか確認する

動作確認


  • 「ショーマッチ」ボタンで、認識したい場面で「現在のマッチング値」が閾値を超えているか確認する
  • 認識してほしい場面で反応しなかったり、関係ない場面で反応しすぎる場合は、閾値を調節する

アクションで動作を設定する


  1. アクション「タイマー」を追加する
    1. 作成しておいたインターバルタイマーマクロを設定する
    2. タイマーの「リセット」「続行」を設定する
  2. アクション「Run」を追加する
    1. バトル開始時に鳴らしたい音声ファイルのパスを設定する

バトル終了を検知する

バトル終了時に画面全体が暗転するタイミングを画像認識して、バトル終了とみなすことにします。

バトル終了時以外にも画面全体が暗転することがありますが、今回はインターバルタイマーを停止するのが目的のため、誤動作したタイマーを停止する目的としても許容します。

画像認識用の画像を用意する


OBSで画面全体が暗転したときのスクリーンショットを撮り、黒い部分のみを切り出します。
右下のインクが動いている表示は認識エリアには含めません。

このとき、切り出した場所の

  • 左上の座標 X, Y
  • 切り出した領域の 幅, 高さ

をメモしておきます。
この値はあとでマクロで使用します。

他人が撮ったスクリーンショットを使用してもよいですが、手持ちのキャプチャーボードの個体差で画像認識結果が変わる可能性がありますので、自作するほうが確実です。

イベントで条件を設定する

「バトル開始を検知する」と同様の手順でイベントを設定します。

アクションで動作を設定する


  1. アクション「タイマー」を追加する
    1. 作成しておいたインターバルタイマーマクロを追加する
    2. タイマーの「一時停止」を設定する
  2. アクション「Run」を追加する
    1. バトル開始時に鳴らしたい音声ファイルのパスを設定する

使用例

【スプラトゥーン3】100日後にイカランプが見えるタコ

更新履歴

  • 2024-09-15 【Splatoon3 Ver. 9.1.0】 投稿







0 件のコメント:

コメントを投稿