スプラトゥーン2のプラベの観戦において「準備OK?」の画面を認識しようと思いました。


これ

画像認識と言えば最近流行りのニューラルネットワークで何とかしてくださいってことになりそうですが、今回は「準備OK?」の表示される位置や大きさや向きは固定なので、そんなことしなくても単純に基準画像とピクセル単位で比較すればよさそうです。学習させるのが面倒だったんや(後で気づいたけど学習用のサンプルを用意すること自体はそんなに大変ではなかった)

というわけで Python3 と cv2 (OpenCV) を使って書いたのがこれ。基準画像は別途用意。

最初はカラーのまま SAD (Sum of Absolute Difference) を計算してたんですが、それだと色変換係数(BT601 か 709 か)やサブサンプリングの不適切な扱いによる色の変化に大きく影響されるので、適当な閾値でグレースケールを二値化して使うことにしました。あと絶対値の和ではなく差の二乗の和の方がいいのではという話もありますが、二値化したらどちらでも同じことになるのでそのままにしてあります。

他には cv2.VideoCapture の不思議な挙動に悩まされました。

  • 一部のキャプチャデバイスには対応していない。特に、AmaRec Video Capture デバイスを開くことができない。ManyCam Virtual WebCam デバイスなら開けるので、間に ManyCam を挟んで回避した。IkaLog でやっているように DirectShow を直接触れば開けるだろうけど、自分で使うだけのものなので楽な方で解決する。ただし、 ManyCam の無料版だと HD 解像度は使えず、そうすると縮小がかかる時に色が若干変わって上で書いた問題が発生するので、もうちょっと何か考えないといけないかもしれない。(映像を認識するためだけに有料版にするのも何だか…)
  • キャプチャデバイスではなく映像ファイルを開く場合、アマレコTVでキャプチャしたAVIファイルは期待通り開けるが、VirtualDub で出力したAVIファイルは開けず、(古い)AviUtl で出力したAVIファイルは2GBのところまでしか読めない。cv2 (OpenCV) は FFmpeg を組み込んでるのになんでこんな謎い挙動になるのか。

ともあれ、「それなりに動く」ようにはなっています。

Trackback

no comment untill now

Add your comment now