動いているカメラで撮影され、動いているオブジェクトが含まれているビデオフィードがあります。すべての静止オブジェクトがビデオフィード内で静止したままになるように、ビデオを安定させたいと思います。 OpenCVでこれを行うにはどうすればよいですか?
つまり、たとえば、prev_frameとnext_frameの2つの画像がある場合、ビデオカメラが静止して見えるようにnext_frameを変換するにはどうすればよいですか?
次の解決策のいずれかを提案できます。
[〜#〜] edit [〜#〜]念のため、以下の3つの注意事項を明確に述べておく必要があります。
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() に関する詳細情報へのリンクを次に示します。
openCVにビデオ安定化クラスが追加されました: http://docs.opencv.org/trunk/d5/d50/group__videostab.html
私はこれから私の答えを過ぎました。 Webcamビデオを安定させる方法?
昨日、私はこの問題について(Python
で)いくつかの作業を行いました。主な手順は次のとおりです。
cv2.goodFeaturesToTrack
を使用してください。cv2.calcOpticalFlowPyrLK
を使用します。cv2.findHomography
を使用します。cv2.warpPerspective
を使用します。しかし、結果は今のところそれほど理想的ではありません。goodFeatures
以外のSIFT keypoints
を選択する必要があるかもしれません。
ソース:
車を安定させる:
これはトリッキーな問題ですが、頭の上からやや単純な状況を提案できます。
next_frame
_を任意の量だけシフト/回転threshold(abs(prev_frame-next_frame_rotated))
を使用します。使用するしきい値をいじる必要があります。min(template_match(prev_frame_background, next_frame_rotated_background))
next_frame
_に適用しますこれは、時間の経過とともに複数のフレームに対してうまく機能しないため、 バックグラウンドアキュムレータ を使用して調査することをお勧めします。そうすることで、アルゴリズムが検索するバックグラウンドは、時間とともに同じになります。
完成するには、次のコメントを追加する必要があります zerm's answer 。静止オブジェクトが1つ選択され、その単一オブジェクトでzermのアプローチ(1)を使用すると、問題が単純化されます。静止しているオブジェクトを見つけて修正を加えた場合、他の静止しているオブジェクトも安定しているように見えると思います。
それは確かにあなたの難しい問題には有効ですが、このアプローチには次の問題があります。
検出、ホモグラフィ推定は、閉塞、突然の動き、モーションブラー、激しい照明の違いなど、さまざまな理由で失敗することがあります。それを処理する方法を検索する必要があります。
ターゲットオブジェクトにオクルージョンがある可能性があります。つまり、そのフレームで検出が失敗し、オクルージョン自体を研究する必要があります。
ハードウェアとソリューションの複雑さによっては、SURFを使用してリアルタイムの結果を得るのに問題が発生する場合があります。 opencvのgpu実装、またはORB、BRIEF、FREAKなどの他の高速機能検出機能を試してみてください。
これはすでに良い答えですが、少し古いアルゴリズムを使用しており、私は同様の問題を解決するためにプログラムを開発したので、さらに答えを追加します。
背景:私はこの研究プロジェクトに取り組んでいましたが、キューに立っている人がカウンターに到達するまでにかかる時間を計算しようとしていました。最初に必要なのはFOOTAGEだったので、私はキャンパスに行き、チケットを取得するために列を組んでいる観光客を記録しました。この時点まで、キューイング時間をどのように計算するのか、またフッテージを記録する際にどのような注意を払えばよいのかわかりませんでした。一日の終わりに、私が記録した映像はすべて手ぶれカメラで記録されていることがわかりました。したがって、この時点で、私は最初にビデオを安定させ、次にキューイング時間を計算するための他のソリューションのみを開発するように要求されました。
テンプレートマッチングを使用したビデオの安定化
結果映像:
Gifを見るとわかるように、選択した静的オブジェクトはフレーム境界の静的なままですが、動きはフレームの端から黒く塗りつぶすことで確認できます。