任天堂SWITCHのSplatoon2国内販売200万本突破おめでとうございます!
私も時間があるときには(ないときでも)遊んでいます。
とはいえウデマエはA+からS+あたりをウロウロしている状態。けして下手ではないと思いたいですが、Youtubeなどの動画を見ているととにかく皆さん上手い。
大事なのはやはり立ち回り。自分がエイム下手や反射神経(年齢ゆえの)などと思いたくないのですが、勝つために、というかスプラトゥーンの醍醐味はやはり立ち回り重視の戦略でしょう。
そこで思いついたのが、現状の味方の人数、敵の人数をきちんと把握していれば、サッカーの攻守のように今は守る時、攻める時がよりはっきり分かるのではないか、ということです。
黒くて×になったところの人がやられているというアイコンです。
実際ゲーム中は塗りと戦闘に夢中で、上のゲージの生死情報をはっきり見る余裕がありません。
これを友達とかが横で教えてくれたら?
まぁずっとそれは無理なので音声で教えてくれるシステムがあったら?
というわけで作りました。
全編はこちら
ゲームの音声はヘッドフォンで聞いています。
上はモニタのPinP機能でSwitchそのままの映像です。この画面を見てプレイします。
下にも映像があります。これはSwitchのHDMIを分岐してビデオキャプチャに入れ、それを画像処理して現在の生きている人数をほぼリアルタイムで表示します。音声も出しています。味方が多ければ有利、敵が多ければ不利、と発声します。
仕組みはPythonとOpenCVです。
最初は簡単だと思ってました。
これを見れば、黒いところが死んでいる。色があるところが生きている、です。
それをどう判断させるか、ですが、
- このアイコンはサイズが戦況によって変わる
- 色も毎回変わる
- 中のブキアイコンは種類が豊富ではみ出していたりする
- 黒は完全な黒ではない
- スペシャルが溜まっていると白くなる
- ベースの色は単色ではなく動く
というのが邪魔をします。
試行錯誤のすえ、結果的にはこういうロジックでかなりの精度が出ました
for i in range(fromx,tox, 3): dstImg = frame[checkY:checkY + 1, i:i + 1] hsv = colorsys.rgb_to_hsv(dstImg[0][0][0], dstImg[0][0][1], dstImg[0][0][2]) if (hsv[2] > 125 and hsv[1] > 0.1) or (hsv[2] > 210): live = 1 point = i color = hsv[2] return live, point, color return 0,0,0
fromx,toxは色をチェックする範囲、checkYは縦の位置です。
イカの後ろに黒い帯があるので、その部分checkY(上から98ピクセル目)を横に3ドットごとに精査していき、色を取得。RGBなのでHSVに変換し、輝度が256中125以上で彩度が10%もしくは輝度が256中210以上なら生きている、そうでなければ死んでいる、というロジックです。
一番左のイカだけは別ロジックで位置を割り出し、そこから他のイカの位置を割り出します。
また、こういうログを吐き出します。
秒数 | 状況 | 味方 | 敵 |
start | |||
10 | 有利 | 4 | 3 |
15 | 有利 | 4 | 2 |
16 | 有利 | 4 | 1 |
19 | 有利 | 4 | 2 |
24 | 不利 | 3 | 4 |
34 | 有利 | 4 | 3 |
35 | 有利 | 4 | 2 |
36 | 有利 | 3 | 2 |
42 | 不利 | 1 | 4 |
43 | 不利 | 0 | 4 |
44 | やられた | ||
47 | 不利 | 1 | 4 |
49 | 不利 | 2 | 4 |
56 | 不利 | 3 | 4 |
59 | 不利 | 2 | 4 |
60 | たおした |
また、人数に変更があった瞬間の画面キャプチャをjpg保存します。
本当は動画も同時にキャプチャしたいのですが、処理が追いつきませんでした。
あとはこの有利不利の情報を使って無茶な攻めをしない、人数有利のときは攻める、を実行すればウデマエがあがるのではと思ってます。が、これってズルですかね?
ズルいという方が多ければ止めます。
ズルいぞオレにもくれ、という方が多ければ配布します。
ただ、その場合声がおっさんなので誰か声ください。
ちなみに
こちらの記事のやられた場面集のffmpeg版はできています。やった場面もちょっといじるだけです。ただ、どちらにしろ需要はないような・・
2018/03/15 追記
大雑把に完成したので、動画アップしました。