1

我只是想知道,如果使用 SurfFeatureDetector 来检测关键点并使用 SurfDescriptorExtractor 来提取 SURF 描述符(参见下面的代码,如此处所述不会提取描述符两次。

  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 文档说,这两个类是 SURF() 类的包装器。是重载的SURF::operator(),一个版本只采用一个关键点向量,另一个版本另外采用一个向量作为描述符。是什么让我着迷……然后都调用了该cvExtractSURF()函数,该函数似乎提取了描述符,无论如何……(我没有深入研究 C 代码,因为我觉得很难理解,所以也许我错了) 但这意味着SurfFeatureDetector将提取描述符而不返回它们。SurfDescriptorExtractor在下一步中使用它只是第二次,这对我来说似乎非常低效。但我说得对吗?

4

1 回答 1

3

您可以放心,检测器实际上并不计算描述符。要查看的关键语句是 surf.cpp 的第 687 行if( !descriptors ) continue;特征在检测期间不计算,它应该是这样的。这种架构很可能是由于冲浪代码在设计/开发为可自行工作之后被“添加”到 OpenCV 中。

作为背景:请注意,检测器和特征提取器是不同的东西。您首先使用提取局部特征的 SurfFeatureDetector“检测”点(使用 SurfDescriptorExtractor)。您拥有的片段是一个很好的指南。

于 2011-11-19T22:35:32.563 回答