Table Of Contents

Previous topic

Common Interfaces of Feature Detectors

Next topic

Common Interfaces of Descriptor Matchers

Common Interfaces of Descriptor Extractors

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.

Note

  • An example explaining keypoint extraction can be found at opencv_source_code/samples/cpp/descriptor_extractor_matcher.cpp
  • An example on descriptor evaluation can be found at opencv_source_code/samples/cpp/detector_descriptor_evaluation.cpp

DescriptorExtractor

class DescriptorExtractor : public Algorithm

Abstract base class for computing descriptors for image keypoints.

class CV_EXPORTS DescriptorExtractor
{
public:
    virtual ~DescriptorExtractor();

    void compute( InputArray image, vector<KeyPoint>& keypoints,
                  OutputArray descriptors ) const;
    void compute( InputArrayOfArrays images, vector<vector<KeyPoint> >& keypoints,
                  OutputArrayOfArrays descriptors ) const;

    virtual void read( const FileNode& );
    virtual void write( FileStorage& ) const;

    virtual int descriptorSize() const = 0;
    virtual int descriptorType() const = 0;
    virtual int defaultNorm() const = 0;

    static Ptr<DescriptorExtractor> create( const String& descriptorExtractorType );

protected:
    ...
};

In this interface, a keypoint descriptor can be represented as a dense, fixed-dimension vector of a basic type. Most descriptors follow this pattern as it simplifies computing distances between descriptors. Therefore, a collection of descriptors is represented as Mat , where each row is a keypoint descriptor.

DescriptorExtractor::compute

Computes the descriptors for a set of keypoints detected in an image (first variant) or image set (second variant).

C++: void DescriptorExtractor::compute(InputArray image, vector<KeyPoint>& keypoints, OutputArray descriptors) const
C++: void DescriptorExtractor::compute(InputArrayOfArrays images, vector<vector<KeyPoint>>& keypoints, OutputArrayOfArrays descriptors) const
Python: cv2.DescriptorExtractor_create.compute(image, keypoints[, descriptors]) → keypoints, descriptors
Parameters:
  • image – Image.
  • images – Image set.
  • keypoints – Input collection of keypoints. Keypoints for which a descriptor cannot be computed are removed. Sometimes new keypoints can be added, for example: SIFT duplicates keypoint with several dominant orientations (for each orientation).
  • descriptors – Computed descriptors. In the second variant of the method descriptors[i] are descriptors computed for a keypoints[i]. Row j is the keypoints (or keypoints[i]) is the descriptor for keypoint j-th keypoint.

DescriptorExtractor::create

Creates a descriptor extractor by name.

C++: Ptr<DescriptorExtractor> DescriptorExtractor::create(const String& descriptorExtractorType)
Python: cv2.DescriptorExtractor_create(descriptorExtractorType) → retval
Parameters:descriptorExtractorType – Descriptor extractor type.

The current implementation supports the following types of a descriptor extractor: