特征描述子提取公用接口 ========================================== .. highlight:: cpp OpenCV封装了一些特征描述子提取算法,使得用户能够解决该问题时候方便使用各种算法。这章用来计算的描述子提取被表达成一个高维空间的向量 ``vector``.所有实现 ``vector`` 特征描述子子提取的部分继承了 :ocv:class:`DescriptorExtractor` 接口. DescriptorExtractor ------------------- .. ocv:class:: DescriptorExtractor 抽象基类 for 对图像关键点计算特征描述子. :: class CV_EXPORTS DescriptorExtractor { public: virtual ~DescriptorExtractor(); void compute( const Mat& image, vector& keypoints, Mat& descriptors ) const; void compute( const vector& images, vector >& keypoints, vector& descriptors ) const; virtual void read( const FileNode& ); virtual void write( FileStorage& ) const; virtual int descriptorSize() const = 0; virtual int descriptorType() const = 0; static Ptr create( const string& descriptorExtractorType ); protected: ... }; 在这个接口中, 一个关键点的特征描述子可以被表达成密集(dense),固定维数的向量。 大部分特征描述子按照这种模式每隔固定个像素计算。特征描述子的集合被表达成 :ocv:class:`Mat` , 其中每一行是一个关键的特征描述子. DescriptorExtractor::compute -------------------------------- 根据检测到的图像(第一种情况)或者图像集合(第二种情况)中的关键点(检测子)计算描述子. .. ocv:function:: void DescriptorExtractor::compute( const Mat& image, vector& keypoints, Mat& descriptors ) const .. ocv:function:: void DescriptorExtractor::compute( const vector& images, vector >& keypoints, vector& descriptors ) const :param image: 图像. :param images: 图像集. :param keypoints:输入的特征关键点. 不能被计算特征描述子的关键点被略过. 另外一些情况新的特征关键点增加进来, 比如: ``SIFT`` 增加了几个主方向上的特征关键点. :param 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 ----------------------------- 从文件点中读取特征描述子提取的对象. .. ocv:function:: void DescriptorExtractor::read( const FileNode& fn ) :param fn: 读取的文件点. DescriptorExtractor::write ------------------------------ 写入特征描述子的提取的对象到文件. .. ocv:function:: void DescriptorExtractor::write( FileStorage& fs ) const :param fs: 写入的文件. DescriptorExtractor::create ------------------------------- 根据名字创建特征描述子提取. .. ocv:function:: Ptr DescriptorExtractor::create( const string& descriptorExtractorType ) :param descriptorExtractorType: Descriptor extractor type. 现有实现支持以下几个类型的特征描述子提取方法: * ``"SIFT"`` -- :ocv:class:`SiftDescriptorExtractor` * ``"SURF"`` -- :ocv:class:`SurfDescriptorExtractor` * ``"ORB"`` -- :ocv:class:`OrbDescriptorExtractor` * ``"BRIEF"`` -- :ocv:class:`BriefDescriptorExtractor` A combined format is also supported: descriptor extractor adapter name ( ``"Opponent"`` -- :ocv:class:`OpponentColorDescriptorExtractor` ) + descriptor extractor name (see above), for example: ``"OpponentSIFT"`` . SiftDescriptorExtractor ----------------------- .. ocv: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 ----------------------- .. ocv: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 --------------------------- .. ocv:class:: OrbDescriptorExtractor 应用:ocv:class:`ORB` 来封装的用于计算特征描述子的类. :: template 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 --------------------------- .. ocv:class:: CalonderDescriptorExtractor 应用:ocv:class:`RTreeClassifier` 来封装的用于计算特征描述子的类. :: template 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 -------------------------------- .. ocv: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& dextractor ); virtual void read( const FileNode& ); virtual void write( FileStorage& ) const; virtual int descriptorSize() const; virtual int descriptorType() const; protected: ... }; BriefDescriptorExtractor ------------------------ .. ocv: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: ... }; 翻译者 ----------- bittnt@ `OpenCV中文网站 `_