ビデオの半一定フレームから固定テンプレート画像を検出する


8

ビデオのさまざまな「状態」を検出するために、さまざまなビデオゲームを処理しようとしているビデオがいくつかあります。

私が取り組んでいる最初のゲームは、スーパーストリートファイター4のエディションです。

その中で、「vs」のキャラクター画面がいつ表示されるのかを検知したいと思います。ビデオの1フレームの例を次に示します。

悪魔vs.竜-SSF4
(から取ら〜10秒マークこの動画

「vs」を検出できた場合、ビデオのフレームが「vs」画面であることを検出できるため、他の情報を探すことができます(今のところ、これを使用して試合が始まる直前の動画のタイムスタンプを検出します)。

とは言っても、ここで私が処理するビデオのフレームについて想定できることはこれです(これが唯一のビデオではなく、数万または数十万とは言わないまでも数千のビデオがありますが、処理におけるスケールの問題)多くのビデオは完全に異なるドメインです):

  • 可能な限り最低解像度の画像を処理して、信頼性の高い結果を得ることが望ましい(低解像度=処理時間の高速化)。上の画像は480 x 270ピクセル(18のYouTubeビデオfmtから取得)ですが、サイズが異なる場合があります(fmt18のYouTubeビデオですが、サイズは640 x 360ピクセルです)。
  • ほとんどの動画は直接フィードされます
  • ほとんどの動画は16:9のアスペクト比になります
  • 赤みがかった背景はアニメーション化されますが、一般的にはそのオレンジ赤の色(炎)内にあります
  • バージョンを示すために、「vs」の下部にフェードイン/アウトバッジが表示される場合があります(これは重要ですが、現時点では重要ではありません)。

サガットvs.アドン-SSF4:AE 2012
このビデオの〜3sマークから取得。また、上記は640 x 360ピクセルの解像度であることに注意してください)

  • 「vs」のサイズと位置は、他の直接フィード動画に比例してほぼ同じになります(まだ確認していませんが、動かないことはわかっています)。
  • キャラクターは、両側に30を超えるプールから選択されます(つまり、フレームの領域は異なります)。
  • ビデオの長さは通常2〜4分で、4,000〜6,00フレームです。ただし、他のさまざまなゲームやライブアクションがカットされた長いビデオ(おそらく2時間)があるかもしれません。これらのビデオはそれほど重要ではありませんが、解決策から、特定のゲームが全体の大きなビデオのどこにポップアップ表示されるかがわかったら、すばらしいです。
  • キャプチャのネイティブ解像度は720pなので、「vs」のベースラインイメージは、「ネイティブ」サイズと見なされるサイズで取得できます。

最終的に、私はコードに.NETで、このパイプラインを探していますが、それはありませんスーパー重要なのは、概念実証のは、私が翻訳し、.NETのためにそれを最適化することができるように含まれる技術の理解だけでなく、ここではより重要です同じジャンルの他のゲームの他のビデオ(もし私が重要な弁別器を見つけることができれば、そしてUltimate Marvel対Capcom 3Street Fighter x TekkenBlazBlue:Continuum Shiftなど)のビデオも同様です。

私もMathematicaに足を踏み入れており、ホームバージョン8.0を持っているので、その環境での概念実証も歓迎されます。


なぜ他のアプローチを求めているのか知りたいです。ヨーダが提案した相互相関アプローチを試しましたか?これは、この種の問題を解決するための非常に単純で自然な手法であり、あなたにとってはうまくいくはずです。
Jason R

@JasonR返信が遅くなってすみません。ヨーダと私は実際にアプローチを詳細に説明しましたが、上で狭く制限されているため、状況に応じてうまく機能します(この手法では、せん断や移動は考慮されません)。とはいえ、私たちはどちらも、アプローチが異なる他の人がいるかどうかを確認することに関心があり、報奨金はそれを奨励する自然な方法です。
casperOne 2012年

回答:


9

「VS」がほとんど同じである場合(2番目の例のように一部のバッジオーバーレイを保存します)、単純な相互相関を使用して、ビデオフレーム内のテンプレートの存在を検出できます。Stack OverflowのMATLABでこれを行うことについて同様の質問に答えました。Photoshopの「魔法の杖」ツールなどを使用して、フレームから「VS」を選択し、テンプレートを作成できます。私はそうしました、そしてこのテンプレートを得るために画像を二値化しました。

2つの画像の異なるカラーチャネル(RGB)を見ると、赤いチャネルがテンプレートの検出に最適であるように見えます。

ここに画像の説明を入力してください

これで、赤いチャネルを2値化されたテンプレートと相互相関させることができ、テンプレートの場所でピークが得られるはずです。私は赤いテンプレートもしきい値処理して2値化することを選択しますが、そうしなくても検出できます。誤検知に対して少し頑健になる傾向があるため、生の相互相関値よりも距離関数を使用することを好みます。C#/。NETは知りませんが、Mathematicaでのアプローチの概要は次のとおりです。

image = Import["http://i.stack.imgur.com/7RwAh.png"];
ImageCorrelate[ Binarize[ColorSeparate[image][[1]], 0.1], vsTemplate, 
   NormalizedSquaredEuclideanDistance] // Binarize[#, 0.2] & // ColorNegate

次のようになります。白い点は、2つの画像のそれぞれで最小距離の領域を示します

ここに画像の説明を入力してください ここに画像の説明を入力してください

その後、必要に応じて次のステップで上記を使用できます。通常、相互相関によりオーバーハングが発生することに注意してください。つまり、(1Dの例を使用して)ポイントの信号をポイントの信号と相互相関させる場合、ポイントの長さの結果が得られます。Mathematicaの実装はあなたのためにオーバーハングを処理します。ただし、C#の機能がわからないので、これを覚えておきたい場合があります(MATLABでは機能しません。リンクされた上記の回答で説明する必要がありました)。M N + M 1NMN+M1

これに基づいて、独自のより堅牢なしきい値基準を実装することもできます。とりあえず、他の人のために検出を強調しておきます。

ここに画像の説明を入力してください ここに画像の説明を入力してください

結合された関数で上記を生成できます:

detectVS[i_Image] := 
 Module[{mask = 
    ImageCorrelate[ Binarize[ColorSeparate[i][[1]], 0.1], vsTemplate, 
       NormalizedSquaredEuclideanDistance] ~Binarize~ 0.2 // 
     ColorNegate},

  ColorConvert[i, "Grayscale"]~ImageAdd~ 
   ImageMultiply[i, Image[mask]~Dilation~ DiskMatrix@100]
  ]

ここには改善の余地がたくさんあります。私は画像処理の肘掛け椅子愛好家なので、最速のアルゴリズムが何であるかわかりません。ただし、調査できることがいくつかあります。

  1. VSがすべてのビデオでほぼ同じ場所にある場合は、画像全体を使用して相互相関する必要はありません。中央のボックスを選択して、それで作業できます。
  2. これは、すべてのフレームに対して行うにはコストのかかる操作になる可能性があります。ただし、ビデオを見ると、VSとキャラクター名が表示されているフレームが4秒強あります。したがって、フレームを毎秒または最大で2秒ごとに分析することをお勧めします。これにより、VSのあるフレームに確実に到達します。VSを検出したら、連続するすべてのフレームの処理を開始して、処理の次の部分を実行できます。
  3. このプロセスは、妥当な範囲で、サイズの変更に対して堅牢でなければなりません。つまり、小さな画像で相互相関を行うことができますが、一致する適切なテンプレートが必要です。画像が特定のセット/標準サイズになることがわかっている場合は、それぞれのテンプレートを作成し、画像サイズに応じて適切なテンプレートを選択できます。
  4. 私が選択したしきい値は試行錯誤によるものでしたが、それらは上記の2つの画像で機能するようであり、他の関連するYouTube動画からは、おそらくほとんどの場合機能します。より専門的なアプローチは、それをブロックに分割し、ヒストグラムを調べて、それがVSに属しているかどうかを推測することです。おそらくベイズ分類器です。ただし、それを始める前にこれを行う必要があることを絶対に確認してください。それはあなたがそれを必要としないほど十分に単純であるように私には思えます。

720pでの「vs」の「ネイティブ」サイズがあることを前提に(更新された質問の最後の箇条書きを参照)、観察されているビデオのサイズまたはスキューを考慮して、自動スケーリング(ダウン、私は想定)できます相互相関の結果が多すぎますか?
casperOne 2012年

@casperOneテストイメージが縮小されている(つまり、トリミングされていない)ことが確実である限り、縮小して動作させることができるはずです。私の懸念は、画像サイズが想定されたものと異なる場合でした。たとえば、本来480x270であるはずの450x250の画像が切り取られた場合、640x480から取得したVSを縮小しても、十分に一致しません(ただし、十分に近い場合があります)。一方、これらの画像がすべて450x250になることがわかっている場合は、これらのフレームの1つからテンプレートを使用できます。
Lorem Ipsum 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.