web-dev-qa-db-ja.com

OpenCVによるビデオ安定化

動いているカメラで撮影され、動いているオブジェクトが含まれているビデオフィードがあります。すべての静止オブジェクトがビデオフィード内で静止したままになるように、ビデオを安定させたいと思います。 OpenCVでこれを行うにはどうすればよいですか?

つまり、たとえば、prev_frameとnext_frameの2つの画像がある場合、ビデオカメラが静止して見えるようにnext_frameを変換するにはどうすればよいですか?

36
Eldila

次の解決策のいずれかを提案できます。

  1. ローカルの高レベル機能の使用:OpenCVにはSURFが含まれているため、フレームごとにSURF機能を抽出します。次に、機能Kd-Tree(これもOpenCVで)を作成し、2つの連続するフレームをそれぞれ照合して、対応する機能のペアを見つけます。それらのペアをcvFindHomographyにフィードして、それらのフレーム間のホモグラフィを計算します。 (結合された..)ホモグラフィに従ってフレームをワープし、安定させます。これは、私の知る限り、非常に堅牢で洗練されたアプローチですが、SURFの抽出とマッチングはかなり遅くなる可能性があります
  2. 2つのフレーム間でわずかな動きしか期待できない場合は、「堅牢性の低い」機能を使用して上記のことを試みることができます。 Harrisコーナー検出を使用して、両方のフレームで互いに最も近いコーナーのペアを構築し、上記のようにcvFindHomographyにフィードします。おそらく高速ですが、堅牢性は低くなります。
  3. 移動を翻訳に制限する場合、cvFindHomographyをより単純なものに置き換えて、機能ペア間の翻訳(平均など)を取得することができる場合があります。
  4. 2つのフレーム間の変換のみが予想される場合は、フェーズ相関(ref。 http://en.wikipedia.org/wiki/Phase_correlation )を使用します。 OpenCVにはDFT/FFTとIFFTが含まれています。数式と説明については、リンクされているウィキペディアの記事を参照してください。

[〜#〜] edit [〜#〜]念のため、以下の3つの注意事項を明確に述べておく必要があります。

  1. ホモグラフィに基づくアプローチは非常に正確である可能性が高いため、静止オブジェクトは静止したままになります。ただし、ホモグラフィには遠近法による歪みとズームも含まれているため、結果が少し珍しい(または一部の速い動きでは歪んだ)ように見える場合があります。正確ではありますが、視覚的にはあまり気に入らないかもしれません。したがって、これをさらなる処理またはフォレンジックなどに使用します。しかし、あなたはそれを試してみるべきです、いくつかのシーン/動きにとっても非常に楽しいかもしれません。
  2. 私の知る限りでは、少なくともいくつかの無料のビデオ安定化ツールが位相相関を使用しています。カメラの「シェイクを解除する」だけの場合は、これが望ましい場合があります。
  3. この分野ではかなり多くの研究が行われています。一部の論文では、はるかに洗練されたアプローチがいくつか見つかります(ただし、OpenCV以外のものが必要になる可能性があります)。
39
zerm

OpenCVには、この種の問題を非常に適切に処理する関数estimateRigidTransform()およびwarpAffine()があります。

これは次のように非常に単純です。

Mat M = estimateRigidTransform(frame1,frame2,0)
warpAffine(frame2,output,M,Size(640,480),INTER_NEAREST|WARP_INVERSE_MAP) 

これでoutputにはframe2のコンテンツが含まれ、これはframe1に合うように最適に配置されます。大きなシフトの場合、OpenCVのバージョンに応じて、Mはゼロマトリックスになるか、まったくマトリックスにならない可能性があります。そのため、それらをフィルターに掛けて適用しない必要があります。それがどれくらいの大きさかわかりません。多分フレーム幅の半分、多分もっと。

推定RigidTransformの3番目のパラメーターはブール値で、任意のアフィン行列も適用するか、それを平行移動/回転/スケーリングに制限するかを指示します。カメラからの画像を安定させるためには、おそらく後者が必要です。実際、カメラ画像の安定化では、回転と並進のみを正規化して、返された行列からスケーリングを削除することもできます。

また、移動するカメラの場合、時間をかけてMをサンプリングし、平均を計算する必要があります。

estimateRigidTransform() および warpAffine() に関する詳細情報へのリンクを次に示します。

15
Octopus

openCVにビデオ安定化クラスが追加されました: http://docs.opencv.org/trunk/d5/d50/group__videostab.html

13
RawMean

私はこれから私の答えを過ぎました。 Webcamビデオを安定させる方法?


昨日、私はこの問題について(Pythonで)いくつかの作業を行いました。主な手順は次のとおりです。

  1. 良いコーナーを見つけるにはcv2.goodFeaturesToTrackを使用してください。
  2. コーナーを追跡するには、cv2.calcOpticalFlowPyrLKを使用します。
  3. ホモグラフィ行列を計算するには、cv2.findHomographyを使用します。
  4. ビデオフレームを変換するには、cv2.warpPerspectiveを使用します。

しかし、結果は今のところそれほど理想的ではありません。goodFeatures以外のSIFT keypointsを選択する必要があるかもしれません。


ソース:

enter image description here

車を安定させる:

enter image description here

5
Kinght 金

これはトリッキーな問題ですが、頭の上からやや単純な状況を提案できます。

  1. _next_frame_を任意の量だけシフト/回転
  2. 静的要素を見つけるには、バックグラウンド減算threshold(abs(prev_frame-next_frame_rotated))を使用します。使用するしきい値をいじる必要があります。
  3. 検索min(template_match(prev_frame_background, next_frame_rotated_background))
  4. 最も近い一致のシフト/回転を記録し、それを_next_frame_に適用します

これは、時間の経過とともに複数のフレームに対してうまく機能しないため、 バックグラウンドアキュムレータ を使用して調査することをお勧めします。そうすることで、アルゴリズムが検索するバックグラウンドは、時間とともに同じになります。

3
Ian Wetherbee

完成するには、次のコメントを追加する必要があります zerm's answer 。静止オブジェクトが1つ選択され、その単一オブジェクトでzermのアプローチ(1)を使用すると、問題が単純化されます。静止しているオブジェクトを見つけて修正を加えた場合、他の静止しているオブジェクトも安定しているように見えると思います。

それは確かにあなたの難しい問題には有効ですが、このアプローチには次の問題があります。

  • 検出、ホモグラフィ推定は、閉塞、突然の動き、モーションブラー、激しい照明の違いなど、さまざまな理由で失敗することがあります。それを処理する方法を検索する必要があります。

  • ターゲットオブジェクトにオクルージョンがある可能性があります。つまり、そのフレームで検出が失敗し、オクルージョン自体を研究する必要があります。

  • ハードウェアとソリューションの複雑さによっては、SURFを使用してリアルタイムの結果を得るのに問題が発生する場合があります。 opencvのgpu実装、またはORB、BRIEF、FREAKなどの他の高速機能検出機能を試してみてください。

3
Rui Marques

これはすでに良い答えですが、少し古いアルゴリズムを使用しており、私は同様の問題を解決するためにプログラムを開発したので、さらに答えを追加します。

  1. 最初に、SIFT、SURFアルゴリズムなどの特徴抽出機能を使用して、画像から特徴を抽出する必要があります。私の場合、FAST + ORBアルゴリズムが最適です。詳細については、 このペーパーを参照
  2. 画像の特徴を取得したら、画像と一致する特徴を見つけます。いくつかのマッチャーがありますが、Bruteforceマッチャーは悪くありません。システムでBruteforceが遅い場合は、KD-Treeなどのアルゴリズムを使用する必要があります。
  3. 最後に、変換された点の誤差を最小限に抑える幾何変換行列を取得する必要があります。このプロセスではRANSACアルゴリズムを使用できます。このプロセスはすべてOpenCVを使用して開発できますが、私はすでにモバイルデバイスで開発しています。 このリポジトリを参照
3
Eunchul Jeon

背景:私はこの研究プロジェクトに取り組んでいましたが、キューに立っている人がカウンターに到達するまでにかかる時間を計算しようとしていました。最初に必要なのはFOOTAGEだったので、私はキャンパスに行き、チケットを取得するために列を組んでいる観光客を記録しました。この時点まで、キューイング時間をどのように計算するのか、またフッテージを記録する際にどのような注意を払えばよいのかわかりませんでした。一日の終わりに、私が記録した映像はすべて手ぶれカメラで記録されていることがわかりました。したがって、この時点で、私は最初にビデオを安定させ、次にキューイング時間を計算するための他のソリューションのみを開発するように要求されました。

テンプレートマッチングを使用したビデオの安定化

  • 世論調査、ドア、または移動することが想定されていないものなどの静的オブジェクトを見つけます。
  • テンプレートマッチングを使用して、連続する各フレームの静的オブジェクトの位置の変化(フレーム境界を基準とする)のオフセットを計算します。
  • 各フレームをオフセット値で変換します。つまり、txとtyとしましょう。

結果映像:

この手法の結果を示すGIF

Gifを見るとわかるように、選択した静的オブジェクトはフレーム境界の静的なままですが、動きはフレームの端から黒く塗りつぶすことで確認できます。

0
Yash_6795