2012-03-28 2 views
1

私はOpenCVでいくつかの重要な機能のマッチングをしようとしていますが、今のところ私はcv::DescriptorMatcher::matchを使用していましたが、予想どおり、OpenCVフィーチャマッチングのさまざまな実装で使用する統合された距離測定?

抽出された一致のフィルタとプルーニングの手順を書き始める前に、float maxDistanceよりも互いに近い一致を返すだけのcv::DescriptorMatcher::radiusMatch関数を試したかったのです。

利用可能なOpenCVマッチングアルゴリズムのラッパーを作成して、追加の機能と追加のextern(マイン)マッチングの実装を可能にするインターフェイスでそれらを使用できるようにしたいと思います。

私のコードでは、OpenCVの特徴マッチングにラッパーとしてだけ1具象クラスの演技は、私は、(同様にcv::DescriptorMatcherとして、それは特定のマッチングアルゴリズムの名前をとり、ファクトリメソッドを通じて、内部でそれを構築する)があるので、 を実装する普遍的な方法cv::DescriptorMatcher::radiusMatchを利用することで、さまざまなマッチャーとフィーチャーの選択肢(すべてのOpenCVフィーチャーディテクター間で変更を可能にする同様のラッパーがあります。 。

残念ながら、OpenCVのドキュメントとcv::DescriptorMatcherインタフェースを介して見た後、私はちょうど試合間の実際の距離を計算するために使用される距離測定に関する情報を見つけることができません。私はサーフの特徴と記述子を使って、かなり良い一致の例hereを見つけましたが、引数の特定の値の実際の意味を理解することはできませんでした。

異なるフィーチャ/ディスクリプタの組み合わせを使用した場合の結果を比較したいので、どのような距離測定を使用しているのかを簡単に知ることができますのすべての組み合わせで意味のあるものを使用してください。私は試してみます。

アイデア/提案はありますか?

更新

は、私はちょうど、様々な機能/記述子の組み合わせでcv::DescriptorMatcher::matchを使用しているとき私が得る機能距離をプリントアウトし、どのような私が得たことだったしました:

  • MSER /大きさの順序をSIFT :100
  • 大きさの
  • SURF/SURF順序:大きさの0.1
  • SURF/SIFT順序:50
  • MSER/SURF大きさの順番:0.2

このことから、どのフィーチャに距離尺度が適用されても、間違いなく正規化されていないと結論づけることができます。私はOpenCVと私自身のインターフェースを使って異なるフィーチャ抽出、記述子の計算、マッチング方法を扱っていますので、私は::radiusMatchの議論をしたいと思います。 (私はBruteForceFlannBasedマッチャーを使用してマッチングを試しましたが、マッチが若干異なりますが、マッチ間のディスアランスはそれぞれの組み合わせで同じオーダーの大きさです)。


いくつかのコンテキスト:私はカメラから取得した二つの絵の上にこれをテストしてい

は(遅い)移動車両の上部に取り付けられています。画像は約5フレーム(車両の動きの1メートル)離れている必要がありますので、ほとんどの機能は目に見えるようにしてください(特に両方の画像のカメラから遠く離れているもの)。

答えて

1

距離の大きさは、実際に使用される機能の種類によって異なります。なぜなら、いくつかの特殊なフィーチャ記述子には、その記述子を最適に使用する特殊なフィーチャマッチャが付属しているからです。異なるフィーチャタイプのマッチ距離のウェイトを取得する場合は、おそらく1ダース以上の1:1マッチのトレーニングセットを作成し、各フィーチャディテクタ/マッチャを解き放つように距離を正規化することです各検出器はすべてのマッチにわたって平均距離が1である。その後、取得した重みを他のデータセットで使用することができます。

1

opencvライブラリのfeatures2d.hppにある次の機能を調べてください。

template<class Distance> void BruteForceMatcher<Distance>::commonRadiusMatchImpl() 

通常、一致間の距離を測定するためにL2の距離を使用します。使用する記述子によって異なります。たとえば、Hamming distanceは、2つの文字列間のビット差をカウントするため、Brief記述子に便利です。

関連する問題