openCV SurfFeatureDetector是否在内部不必要地提取描述符?

时间:2011-11-18 11:34:03

标签: c++ performance opencv surf

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

  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只是第二次,这对我来说效率非常低。但我是对的吗?

1 个答案:

答案 0 :(得分:3)

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

作为背景:请注意,探测器和特征提取器是不同的东西。您首先使用SurfFeatureDetector“检测”点,其中本地功能被提取(使用SurfDescriptorExtractor)。你有的片段是一个很好的指南。