特征描述子提取公用接口

OpenCV封装了一些特征描述子提取算法,使得用户能够解决该问题时候方便使用各种算法。这章用来计算的描述子提取被表达成一个高维空间的向量 vector.所有实现 vector 特征描述子子提取的部分继承了 DescriptorExtractor 接口.

DescriptorExtractor

class DescriptorExtractor

抽象基类 for 对图像关键点计算特征描述子.

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

    void compute( const Mat& image, vector<KeyPoint>& keypoints,
                  Mat& descriptors ) const;
    void compute( const vector<Mat>& images, vector<vector<KeyPoint> >& keypoints,
                  vector<Mat>& descriptors ) const;

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

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

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

protected:
    ...
};

在这个接口中, 一个关键点的特征描述子可以被表达成密集(dense),固定维数的向量。 大部分特征描述子按照这种模式每隔固定个像素计算。特征描述子的集合被表达成 Mat , 其中每一行是一个关键的特征描述子.

DescriptorExtractor::compute

根据检测到的图像(第一种情况)或者图像集合(第二种情况)中的关键点(检测子)计算描述子.

C++: void DescriptorExtractor::compute(const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors) const
C++: void DescriptorExtractor::compute(const vector<Mat>& images, vector<vector<KeyPoint>>& keypoints, vector<Mat>& descriptors) const
Parameters:
  • image – 图像.
  • images – 图像集.

:param keypoints:输入的特征关键点. 不能被计算特征描述子的关键点被略过. 另外一些情况新的特征关键点增加进来, 比如: SIFT 增加了几个主方向上的特征关键点.

Parameters:
  • 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::read

从文件点中读取特征描述子提取的对象.

C++: void DescriptorExtractor::read(const FileNode& fn)
Parameters:
  • fn – 读取的文件点.

DescriptorExtractor::write

写入特征描述子的提取的对象到文件.

C++: void DescriptorExtractor::write(FileStorage& fs) const
Parameters:
  • fs – 写入的文件.

DescriptorExtractor::create

根据名字创建特征描述子提取.

C++: Ptr<DescriptorExtractor> DescriptorExtractor::create(const string& descriptorExtractorType)
Parameters:
  • descriptorExtractorType – Descriptor extractor type.

现有实现支持以下几个类型的特征描述子提取方法:

A combined format is also supported: descriptor extractor adapter name ( "Opponent"OpponentColorDescriptorExtractor ) + descriptor extractor name (see above), for example: "OpponentSIFT" .

SiftDescriptorExtractor

class SiftDescriptorExtractor

应用:ocv:class:SIFT 来封装的用于计算特征描述子的类.

class SiftDescriptorExtractor : public DescriptorExtractor
{
public:
    SiftDescriptorExtractor(
        const SIFT::DescriptorParams& descriptorParams=SIFT::DescriptorParams(),
        const SIFT::CommonParams& commonParams=SIFT::CommonParams() );
    SiftDescriptorExtractor( double magnification, bool isNormalize=true,
        bool recalculateAngles=true, int nOctaves=SIFT::CommonParams::DEFAULT_NOCTAVES,
        int nOctaveLayers=SIFT::CommonParams::DEFAULT_NOCTAVE_LAYERS,
        int firstOctave=SIFT::CommonParams::DEFAULT_FIRST_OCTAVE,
        int angleMode=SIFT::CommonParams::FIRST_ANGLE );

    virtual void read (const FileNode &fn);
    virtual void write (FileStorage &fs) const;
    virtual int descriptorSize() const;
    virtual int descriptorType() const;
protected:
    ...
}

SurfDescriptorExtractor

class SurfDescriptorExtractor

应用:ocv:class:SURF 来封装的用于计算特征描述子的类.

class SurfDescriptorExtractor : public DescriptorExtractor
{
public:
    SurfDescriptorExtractor( int nOctaves=4,
                             int nOctaveLayers=2, bool extended=false );

    virtual void read (const FileNode &fn);
    virtual void write (FileStorage &fs) const;
    virtual int descriptorSize() const;
    virtual int descriptorType() const;
protected:
    ...
}

OrbDescriptorExtractor

class OrbDescriptorExtractor

应用:ocv:class:ORB 来封装的用于计算特征描述子的类.

template<typename T>
class ORbDescriptorExtractor : public DescriptorExtractor
{
public:
    OrbDescriptorExtractor( ORB::PatchSize patch_size );

    virtual void read( const FileNode &fn );
    virtual void write( FileStorage &fs ) const;
    virtual int descriptorSize() const;
    virtual int descriptorType() const;
protected:
    ...
}

CalonderDescriptorExtractor

class CalonderDescriptorExtractor

应用:ocv:class:RTreeClassifier 来封装的用于计算特征描述子的类.

template<typename T>
class CalonderDescriptorExtractor : public DescriptorExtractor
{
public:
    CalonderDescriptorExtractor( const string& classifierFile );

    virtual void read( const FileNode &fn );
    virtual void write( FileStorage &fs ) const;
    virtual int descriptorSize() const;
    virtual int descriptorType() const;
protected:
    ...
}

OpponentColorDescriptorExtractor

class OpponentColorDescriptorExtractor

实现了在d对立颜色空间(Opponent Color Space)中计算特征描述子的类. (参考文章Van de Sande et al., CGIV 2008 Color Descriptors for Object Category Recognition). Input RGB image is transformed in the Opponent Color Space. Then, an unadapted descriptor extractor (在构造函数中设置) 计算图像三个通道中的每个通道对应的特征描述子和 连接它们成单一颜色特征描述子.

class OpponentColorDescriptorExtractor : public DescriptorExtractor
{
public:
    OpponentColorDescriptorExtractor( const Ptr<DescriptorExtractor>& dextractor );

    virtual void read( const FileNode& );
    virtual void write( FileStorage& ) const;
    virtual int descriptorSize() const;
    virtual int descriptorType() const;
protected:
    ...
};

BriefDescriptorExtractor

class BriefDescriptorExtractor

计算BRIEF描述子的类.参考 Calonder M., Lepetit V., Strecha C., Fua P. BRIEF: Binary Robust Independent Elementary Features , 11th European Conference on Computer Vision (ECCV), Heraklion, Crete. LNCS Springer, September 2010.

class BriefDescriptorExtractor : public DescriptorExtractor
{
public:
    static const int PATCH_SIZE = 48;
    static const int KERNEL_SIZE = 9;

    // bytes is a length of descriptor in bytes. It can be equal 16, 32 or 64 bytes.
    BriefDescriptorExtractor( int bytes = 32 );

    virtual void read( const FileNode& );
    virtual void write( FileStorage& ) const;
    virtual int descriptorSize() const;
    virtual int descriptorType() const;
protected:
    ...
};