1

SurfFeatureDetector を使用してキーポイントを検出し、SurfDescriptorExtractor を使用して SURF 記述子を抽出すると (ここで説明されている以下のコードを参照)、記述子が 2 回抽出されないのではないかと思いました。

  SurfFeatureDetector detector( minHessian );

  std::vector<KeyPoint> keypoints;
  detector.detect( img, keypoints ); //detecting keypoints, extracting descriptors without returning them

  SurfDescriptorExtractor extractor;
  Mat descriptors;

  extractor.compute( img, keypoints, descriptors ); // extracting descriptors a second time

openCV のドキュメントによると、これら 2 つのクラスは SURF() クラスのラッパーです。はSURF::operator()オーバーロードされており、1 つのバージョンはキーポイント ベクトルのみを取得し、もう 1 つのバージョンはさらに記述子のベクトルを取得します。私が興味をそそられるのは...両方ともcvExtractSURF()、記述子を抽出するように見える関数を呼び出します...(理解するのが難しいので、Cコードを深く掘り下げていないので、間違っているかもしれません) しかし、これは がSurfFeatureDetector記述子を返さずに抽出することを意味します。次のステップでを使用するSurfDescriptorExtractorと、2 回目に実行されるだけで、非常に非効率的です。しかし、私は正しいですか?

4

1 に答える 1

3

検出器が実際に記述子を計算しないことを保証できます。注目すべき重要なステートメントは、surf.cpp の 687 行目です。if( !descriptors ) continue;特徴は、本来あるべき方法で検出中に計算されません。この種のアーキテクチャは、単独で動作するように設計/開発された後、Surf コードが OpenCV に「追加」されたことが原因である可能性が最も高いです。

背景として: 検出器と特徴抽出器は別のものであることに注意してください。最初に、ローカルフィーチャが抽出されるSurfFeatureDetector を使用してポイントを「検出」します (SurfDescriptorExtractor を使用)。あなたが持っているスニペットは良いガイドです。

于 2011-11-19T22:35:32.563 に答える