7
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【初心者向け】OpenCV, NumPyを使ってSplatoonの解析をしてみる

Last updated at Posted at 2023-03-09

:diamonds: はじめに

僕はPythonを勉強し始めて数か月経った時に、Pythonの練習として何か作りたいなーと思っていました。
そこで、当時ハマっていたSplatoon2に関する解析システムを作りました。

この記事は、それに関してNotionで書いた↓の記事をもとに、より汎用的な内容に変えたものです。

Pythonの練習をしたいけど何を作ればいいか分からない、、

Pythonを使ってゲームの分析をすることでゲームでもっと勝てるようになりたい!

といった方を対象として書いています。
実際これはプログラミングを始めてから半年も経っていないときに作っているので、あまり高度なことはしていないと思います。
ぜひこれを参考にして色々作ってみてください!

質問があればぜひコメントください!

:diamonds: この記事を読んで知ることができること

  • Pythonを使ってどんなことができるのか
  • Pythonを使って画像をどうやって扱えばいいか
  • Pythonを使ってNintendoSwitchなどのゲームの分析をする方法

:diamonds: 必要なもの

:spades: プログラム実行環境

環境 version
Windows 10 -
Python 3.10.6
opencv-python 4.5.5.64
numpy 1.22.3

細かく書いていますが、今回作るシステムでは環境による違いはあまりない気がします。

:spades: その他アプリやデバイス

  • Nintendo Switch

  • Splatoon2

ChatGPTにSplatoon2の概要を教えてもらいました。
image.png

  • OBS
    画面を録画するのに使います。
    これも録画できればなんでもいいです。
    OBSの初期設定はここらへんの記事が参考になるかなと思います。

  • キャプチャーボード
    Nintendo Switchの画面をPCに映すことができればなんでもいいです。
    僕は安いやつを買いました。

:diamonds: 実装したいこと

Splatoon2は4対4の計8人のプレイヤーで行います。
1試合は3分のものと5分のものがあり、後者は時間が延長することもあります。
Untitled.png
これがゲーム画面で、画面上部を見ると、8人のプレイヤーの状況や、試合の残り時間を見ることができます。
今回実装したいことは、1試合の8人のプレイヤーの状況の推移を記録することです。
つまり、↓のようなデータを取得することを目標にします!

時間 プレイヤー1 プレイヤー2 プレイヤー3 プレイヤー4 プレイヤー5 プレイヤー6 プレイヤー7 プレイヤー8
0 alive alive death alive SP alive alive death
1 alive alive alive alive SP alive alive death
2 death alive alive alive SP alive alive alive
3 death SP alive alive SP death SP alive
4 death SP alive alive alive death SP alive
5 death SP alive alive alive death SP alive
6 death SP alive death alive death SP alive
7 death SP alive death alive death SP alive
...

:diamonds: 方法

:spades: 全体の流れ

image.png
※図はdraw.ioで作成しました。
全体の流れは上の図のような感じです。

:spades: アイコンの座標を取得

Untitled.png

この画像から、

Untitled.png

の部分を抜き取りたい。
そのためにまず、OpenCVを使ってアイコンの座標を取得します。

このあたりが参考になるかなと思います。

:spades: アイコンのトリミングをする

上で取得した座標をもとに、アイコンのトリミングをします。

このあたりが参考になるかなと思います。

:spades: 画像データを配列として読み取り、配列として画像を判定する

Untitled.pngUntitled.pngUntitled.png
トリミングしたアイコンの色をもとに、左の画像から、"alive", "death", "SP"と判定します。

"alive": 黄色が多い
"death": 彩度の低い白黒が多い
"SP": 白っぽい

ということが画像から読み取れます。

まず"alive"の判定をします。

Untitled.png

このあたりが参考になるかなと思います。

黄色だけを抽出した後、2値化をして、アイコンを0と1の2次元配列に変換します。
(黄色が1、それ以外が0)

次に"death"の判定をしていきます。

Untitled.png

彩度が低いという特徴を使います。
まず、画像の色をRGBからHSVに変換します。

そして、彩度を表すSの、その画像における平均を計算し、それがある一定値以下であれば"death"だと判定します。

最後に"SP"を判定していきます。

Untitled.png

"SP"の時には白っぽい、つまり明度が高いということが読み取れたので、"death"のときと同じように、HSVに変換した後、明度Vの平均を計算して、それがある一定値以上であれば"SP"だと判定します。

さらにプレイヤーの状況の判定に加えて

  • マップを開いているかどうかを判定する
  • 試合が始まっているかどうかを判定する

の機能もつけていますが、ここでは省略します。

:diamonds: 結果

いい感じに判定できてそうです。
アイコンの下の色とプレイヤーの状況の関係は下の通り。

  • 赤: "alive"
  • 黒: "death"
  • 白: "SP"

結果1↓
image.png

結果2↓
image.png

:diamonds: 今後していきたいこと

今回のシステムでは1試合の中の8人のプレイヤーの状態をデータとして取得しました。
今後はこのデータを機械学習にかけて、

  • どういう試合の進み方だとその試合に勝ちやすいのか

を調べていけたらなと思います。

:diamonds: まとめ

以上、OpenCV, NumPyを使ったSplatoonの解析プログラムについて解説しました。
作りたいものをベースとしてそのためにはどんなプログラムを書けばいいか、
つまり、

「プログラミングは手段である」

ということを意識してこの記事を書きました。

そのため、今回のシステムでは簡単な技術しか使っていません。もっといい方法もあったんじゃないかなと今では思っています。
この記事を読んでいただいた方も、これを機会に知識を深めていって、より良い分析方法を探してみてください!
もし思いついたことがあったり質問があったりしたらコメントで教えてもらえると嬉しいです!

最後まで読んでいただきありがとうございました!

:diamonds:実際に書いたプログラム

Splatoon2からSplatoon3への移行をしようとしたときにソースコードを少し変えたので、動かなくなっているかもしれません。。
ただ、プログラムコードの参考にはなると思います!

7
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?