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 回目に実行されるだけで、非常に非効率的です。しかし、私は正しいですか?