no-image

第一回 ナワバリバトルの判定ツール

やりたいこと

ナワバリバトルをする際に、どっちがどのくらい勝っているのかはわかりにくい。相手にピンチがついていれば圧倒的に勝っていることがわかるが、圧倒的でなくてもちょっとくらいの差がついていればわかるようにしてほしいのである。

マップ状況は常に確認できるものではないが、Xボタンを押せばいつでも確認できる。

ということは、最後にマップをひらいたときにどっちがどのくらい有利か?くらいは判断できるのではないかと考えた。

環境構築

Python

ここから最新版をインストールする。

記事執筆時の最新版は3.7.2である。WindowsユーザであるならWindows x86-64 web-based installerをダウンロードしておけば良いと思う。

最後にPythonのパスを通すかどうかきかれる場面があるので、YESを押すこと。ここを失敗すると後々めんどくさい。

OpenCV

こっちはダウンロードしてインストールするだけ、特に難しいことはありません。

キャプチャボードの映像を表示

えむいーさんが使用しているキャプチャボードはGC550です。

それ以外のキャプチャボードでの動作は未確認です。

import cv2

cap = cv2.VideoCapture(0)

# GC550は解像度が一致しないと表示されない
cap.set(3,1920)
cap.set(4,1080)

while True:
    ret, frame = cap.read()
    cv2.imshow('SplaHack', frame)

    # ESCキーが押されたら終了する
    k = cv2.waitKey(1)
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()
Pythonでキャプチャ

入力された信号を表示するだけであれば簡単に実装することができた。

RGB to HSV

コンピュータで画像を扱う場合はRGBよりもHSVの方が直感的でわかりやすいらしい。

ちなみにぼくはRGBの方がわかりやすいです。

// RGB to HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
cv2.imshow('SplaHack', hsv)

コードをこのように変更することでRGBではなくHSVに変換した画像を見ることができます。

HSV

RGBと比べるとすごい色になっていますが、これがコンピュータがわかりやすい色らしいです。

自分のチームの色を認識する

どうやって有利不利を判断するかですが、単純にピクセル数で判定するのが良いかと思いました。

色覚サポートをオンにしていると色がオレンジか青の二種類に固定されるので、それをオンにした状態を想定します。

というのも、色の種類が増えれば増えるだけめんどくさくなるからです。

つまり、以下のようなロジックになります。

  1. 自分と相手のチームの色を判定
  2. マップをひらいたときにマップ画像からピクセル数をカウント
  3. どちらの色がどれだけ塗られているか概算を求める

このとき、どちらの色がどれくらい塗られているかを判定するためには適当にナワバリバトルで500ptくらい塗った画像の、自分の色のピクセル数が500ptとなるような上手いピクセル数を塗りポイントの換算式を求めれば良いことになります。

これは恐らく線形に近似できるので、そこまで難しいことではないかと。

大事なのは、しっかりと自分のチームの色を認識できるかです。

色判定はほんの僅かでも色が違うと異なる色のピクセルとして判定されてしまいます。この辺りは幅をもたせることで柔軟に対応できる方が良いかもしれませんね。

第二回ではピクセル数を求めるコードを完成させたいと思います。