0

C++ で Opencv を使用して、ビデオ スタビライザーに取り組んでいます。
プロジェクトのこの時点で、3 つの異なる手法 (オプティカル フロー、位相相関、関心のある BFMatcher) を使用して、2 つの連続するフレーム間の変換を正しく見つけることができます。
安定した画像を得るために、(連続するフレームからの) すべての平行移動ベクトルを 1 に加算します。これはwarpAffine、出力画像を修正する関数で使用されます。

固定カメラでは良好な結果が得られますが、翻訳中のカメラでは結果が非常に悪く、画像が画面から消えます。

残したいパンニングの動きと、取り除きたいジッターの動きを区別する必要があると思います。しかし、私は他のソリューションに対してオープンです。

4

2 に答える 2

0

可能なアプローチをお勧めします(複雑さの順に):

  • 安定化を適用する前に、簡単に実装できる IIR ローパス フィルターを変換ベクトルに適用します。これにより、高周波数 (ジッター) と低周波数 (パンニング) が分離されます。
  • 同じ考え方で、もう少し複雑ですが、カルマン フィルター処理を使用して、一定の速度または加速度でモーションを追跡します。そのためにOpenCVのカルマンフィルターを使用できます。
  • もう少し注意が必要なのは、モーションの振幅にしきい値を設定して、2 つの状態 (移動カメラと静止カメラ) の間で決定し、変換をフィルター処理するかどうかです。
  • 最後に、機械学習の精巧な手法を使用して、ユーザーの目的のモーション (静的、パンなど) を識別し、安定化に使用されるモーション ベクトルをフィルタリングするかどうかを試すことができます。

単なるしきい値はローパス フィルターではありません。考えられるローパスフィルター (実装が簡単です):

  • よく知られている平均化があります。これは、カットオフ周波数が平均化方程式に入るサンプル数に依存するローパス フィルターです (サンプル数が多いほど、カットオフ周波数は低くなります)。
  • よく使用されるフィルターの 1 つに指数フィルターがあります (指数関数的な減衰で過去を忘れるため)。のように単純に計算されx_filt(k) = a*x_nofilt(k) + (1-a)x_filt(k-1)ます0 <= a <= 1
  • もう 1 つの一般的なフィルター (および次数 1 を超えて計算できる) は、バターワース フィルターです。
  • ウィキペディアのローパスフィルターIIRフィルターなど...
于 2013-06-13T14:16:50.837 に答える