2012-04-15 4 views
21

フォーラムでsimilar questionが見つかりました。しかしそこの答えは私の質問には答えません。オプティカルフローによるフィーチャトラッキング

  • 私は一度だけ最初の画像上の特徴検出(goodFeaturesToTrack)を行い、その後、これらの機能を追跡するために、オプティカルフロー(calcOpticalFlowPyrLK)を使用する場合、問題がある:第一の画像上で検出された機能だけができます追跡される。これらの機能が画像を超えると、追跡する機能はありません。

  • 新しい画像ごとにフィーチャ検出を実行すると、前回検出されたフィーチャが今回検出されない可能性があるため、フィーチャトラッキングが安定しません。

私はオプティカルフローを3D再構成に使用しています。だから私はどのような機能を追跡するのに興味がない、代わりに、私は視野の機能が安定して追跡することができるかどうかだけを気にします。要約すると、私の質問はです:オプティカルフローを使用して古い機能を追跡するにはどうすればいいですか?そしてその間に視野に入って来て、視野を越える古い機能を削除する新しい画像機能を追加しますか?

+0

この古い質問では言及されていないので、lkdemoのpythonバージョンはC++のそれよりも少し上手くいくので、いくつかの点でこれを解決できるでしょう:https://github.com/npinto/opencv/blob /master/samples/python/lkdemo.py –

答えて

17

いくつかのアプローチが可能です。良い方法は次のように進む:フレーム1に

  1. がN特徴を検出、これはフレームk内のオプティカルフロー
  2. によって特徴を追跡キーフレームメートル= 1
  3. フレームkである場合数
    • このフレームがキーフレームメートル+ 1
    • はホモグラフィまたは間の動きを記述する基本行列を計算である:正常のN/2下で低下する特徴を追跡キーフレームメートルであり、m + 1
    • Nの特徴を検出し、古いもの
    • を破棄K:この方法では2

へ= K + 1、外出先基本的にはカメラの動きを推定最後の2つのキーフレームの間。

あなたが3D再構成のために使用されるものアプローチは言及しなかったので、私はどちらかHまたはF仮定は、最初に推定された動きに計算されます。それらを正確に推定するには、キーフレーム間のベースラインをできるだけ広くする必要があります。一般に、最良の戦略は、カメラの粗い動きモデルを考慮に入れることです。カメラが手で保持されている場合は、カメラが車やロボットの上部に固定されている場合とは異なる戦略を使用する必要があります。 Pythonで最小限の作業例を提供できれば助かります。私に教えてください。

+0

ありがとうございます。それは良い解決策と思われます。私はC++で働いています。だから寛大な申し出をどうもありがとう。 – Shiyu

+0

@fireant答えをありがとう。あなたが私にPythonの例を与えることができたらうれしいですね。 – Clive

+0

@Clive、これはほぼ2年遅れですが、これが誰かを助けることを願っています! [コード](http://pastebin.com/X1dpwT9q) マジックは、更新機能のコメント行を記入する行に現れます。ほとんどのソースコードは、[ここ](http://docs.opencv.org/trunk/d7/d8b/tutorial_py_lucas_kanade.html)で読むことができるOpenCVのドキュメントと同じです。 –

3

ドキュメント化の目的で、オプティカルフロートラッキングのGPU/C++実装がいくつかあります。あなたのコードはあなたの目的に適しているかもしれませんが、トラックの出力データが必要な場合は、herehere、またはhereのいずれかのソースを調べることを検討してください。

0

既存の機能に新しい機能を追加するもう1つの方法があります。 cv::goodFeaturesToTrack()にマスクを渡すことができます。したがって、新しいMat(元の画像と同じサイズ、type: CV_8UC1)を作成し、すべてのピクセルを255に設定し、各特徴点を黒丸でこのMatに描画します。 goodFeaturesToTrack()にこのマスクを渡すと、その黒丸はその機能によってスキップされます。

フィーチャーの量を制限することもお勧めします。 MAX_FEATURES = 300に限定してみましょう。次に、トラック数がMAX_FEATURES - z (e.g. z = 30)より少ないかどうかすべてのサイクルをチェックします。場合には、上記のzまでの新機能を検索し、それらをあなたのフィーチャーコンテナに追加します。

また、追跡が失敗したときに機能を積極的に削除する必要があります。したがって、calcOpticalFlowPyrLKのステータス出力を調べる必要があります。

+0

これは非常に良いアプローチですが、マスクを使用する方が画像全体を使用するよりも時間がかかります。私はそれを信じることはできませんが、少なくともバージョン3.2ではそれが起こっています。 – Pablo

関連する問題