我只是想知道,如果使用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
只是第二次,这对我来说效率非常低。但我是对的吗?
答案 0 :(得分:3)
您可以放心,探测器实际上并不计算描述符。要查看的关键语句是surf.cpp的第687行if( !descriptors ) continue;
在检测过程中不会计算特征,应该是这样。这种体系结构很可能是因为冲浪代码在设计/开发为自己工作后被“添加”到OpenCV。
作为背景:请注意,探测器和特征提取器是不同的东西。您首先使用SurfFeatureDetector“检测”点,其中本地功能被提取(使用SurfDescriptorExtractor)。你有的片段是一个很好的指南。