こんにちは、Clom です。
今回は OpenCV を用いてスプラトゥーン2のキルシーンを切り出すものを自動化する、
といったものを書いてみましたのでその紹介をできればと思います。
今回使用したものは mp4 の動画を Python と OpenCVを使用して再生と終了位置を検知し、ffmpeg を用いてクリップを作成するといったものになります。
今回は OpenCV を用いてスプラトゥーン2のキルシーンを切り出すものを自動化する、
といったものを書いてみましたのでその紹介をできればと思います。
今回使用したものは mp4 の動画を Python と OpenCVを使用して再生と終了位置を検知し、ffmpeg を用いてクリップを作成するといったものになります。
実際に作成されたクリップのキャプチャー画像は次のものになります。
キルシーンのクリップを切り出すためには画面上にあるキルログである
この部分を画像認識で検知する必要があります。
〇〇〇〇〇をたおした! の部分はプレイヤーによってワードが変わるためこの部分を検知するためには文字の部分ではなくイカのアイコンを使用することで検出を行うように実装していました。
実際に検出に使用したアイコンが↑の画像になります(テンプレート画像)。
このテンプレート画像と各フレームでの画像の領域を比較し類似度を測定、その類似度が一定値を超えた場合にこのフレームでキルが発生したという風に判断を行っています。
テンプレート画像とフレーム側の画像との比較は両方の画像をグレースケール化にして比較し類似度を検出しています。
テンプレート画像とフレームとの類似度が下回ると、キルのアクションが終わったと認識してキル開始の位置の数秒前から終了後の数秒後までをFFmpeg で記録を行います。
キル開始とキル終了の時間に関してはフレームの値で取得されるため、秒に変換する必要があるため、動画のfps値を取得し、その値とフレームの値を用いることで秒の値の取得を行います。
(120/60 = 2[sec] のような形です。)
このようにしてキルシーンごとにクリップを作成することを可能にしています。
OpenCVのテンプレートマッチングを用いて実装を行っていたのですが、メリデメも多くあります。
メリット
・画像検出が容易 (Python の場合 cv2.matchTemplate で検出が行える)
デメリット
・解像度別でテンプレート画像を用意する必要があり、柔軟性に欠ける
実際に実装したコードはこちらです。(ffmpeg は windows 版を使用しているため Linux や MacOS の場合はそれぞれの環境ごとにコマンドを置き換えていただければと思います。)
実際にプレイ動画から取得されたクリップ動画がこちらになります。
このようにOpenCVとFFmpeg を組み合わせることでキルシーンのクリップを切り出すことが可能になります。
今後はこれをベースにして改良を重ねていければいいなと思っています。
キルシーンのクリップを切り出すためには画面上にあるキルログである
この部分を画像認識で検知する必要があります。
〇〇〇〇〇をたおした! の部分はプレイヤーによってワードが変わるためこの部分を検知するためには文字の部分ではなくイカのアイコンを使用することで検出を行うように実装していました。
実際に検出に使用したアイコンが↑の画像になります(テンプレート画像)。
このテンプレート画像と各フレームでの画像の領域を比較し類似度を測定、その類似度が一定値を超えた場合にこのフレームでキルが発生したという風に判断を行っています。
テンプレート画像とフレーム側の画像との比較は両方の画像をグレースケール化にして比較し類似度を検出しています。
テンプレート画像とフレームとの類似度が下回ると、キルのアクションが終わったと認識してキル開始の位置の数秒前から終了後の数秒後までをFFmpeg で記録を行います。
キル開始とキル終了の時間に関してはフレームの値で取得されるため、秒に変換する必要があるため、動画のfps値を取得し、その値とフレームの値を用いることで秒の値の取得を行います。
(120/60 = 2[sec] のような形です。)
このようにしてキルシーンごとにクリップを作成することを可能にしています。
OpenCVのテンプレートマッチングを用いて実装を行っていたのですが、メリデメも多くあります。
メリット
・画像検出が容易 (Python の場合 cv2.matchTemplate で検出が行える)
デメリット
・解像度別でテンプレート画像を用意する必要があり、柔軟性に欠ける
実際に実装したコードはこちらです。(ffmpeg は windows 版を使用しているため Linux や MacOS の場合はそれぞれの環境ごとにコマンドを置き換えていただければと思います。)
実際にプレイ動画から取得されたクリップ動画がこちらになります。
このようにOpenCVとFFmpeg を組み合わせることでキルシーンのクリップを切り出すことが可能になります。
今後はこれをベースにして改良を重ねていければいいなと思っています。
argv[1]には何を代入すればいいですか?