24

フォーラムで同様の質問を見つけました。しかし、そこにある答えは私の質問には答えません。

  • 最初の画像で特徴検出 (goodFeaturesToTrack)を 1 回だけ行い、オプティカル フロー (calcOpticalFlowPyrLK) を使用してこれらの特徴を追跡すると、最初の画像で検出された特徴のみを追跡できるという問題があります。これらの特徴が画像を超えると、追跡する特徴がなくなります。

  • 新しい画像ごとに特徴検出を行うと、前回検出された特徴が今回は検出されない可能性があるため、特徴追跡は安定しません。

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

4

3 に答える 3

19

いくつかのアプローチが可能です。良い方法は次のようになります。

  1. フレーム1でN個の特徴を検出します。これは、キーフレームm=1です。
  2. フレームkでは、オプティカルフローによって特徴を追跡します
  3. 正常に追跡された特徴の数がN/2を下回る場合、フレームkで次のようになります。
    • このフレームはキーフレームm+1です
    • キーフレームmとm+1の間の動きを記述するホモグラフィまたは基本行列を計算します
    • N個の機能を検出し、古い機能を破棄します
    • k:= k+1は2に移動します

この方法では、基本的に、最後の2つのキーフレーム間のカメラの動きを推定します。

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

于 2012-04-16T10:14:22.897 に答える
3

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

于 2012-04-17T17:04:58.927 に答える
0

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

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

また、追跡に失敗した場合は、機能を積極的に削除する必要があることに注意してください。したがって、 のステータス出力を確認する必要がありますcalcOpticalFlowPyrLK

于 2016-03-29T20:39:30.000 に答える