So far I used
No, there is no difference.
You can see in the source code that they are the same:
typedef SURF SurfFeatureDetector; typedef SURF SurfDescriptorExtractor;
XXXDescriptorExtractor are simply common interfaces for the 2 separate tasks, so you can separate the keypoints detection from the descriptor computation, and you can for example detect keypoints with MSER and compute descriptors with SIFT.
You can see here that
SURF inherits fromFeature2D`:
class CV_EXPORTS_W SURF : public Feature2D
DescriptorExtractor are the same as
typedef Feature2D FeatureDetector; typedef Feature2D DescriptorExtractor;
The distinction between FeatureDetector and DescriptorExtractor is:
Feature detectors in OpenCV have wrappers with a common interface that enables you to easily switch between different algorithms solving the same problem. All objects that implement keypoint detectors inherit the FeatureDetector interface.
The common problem is to extract the
Extractors of keypoint descriptors in OpenCV have wrappers with a common interface that enables you to easily switch between different algorithms solving the same problem. This section is devoted to computing descriptors represented as vectors in a multidimensional space. All objects that implement the vector descriptor extractors inherit the DescriptorExtractor interface.
This distinction is useful to separate the task of finding the keypoints from the task of computing the descriptor, since not all methods can do both. E.g. MSER is just a feature detector, but doesn't compute the descriptors.