通用特征描述子匹配公用接口 ================================================ .. highlight:: cpp 特征关键点描述子的匹配在OpenCV中已经被封装成一个公用接口.这个接口允许用户调用不同算法解决问题.这章主要研究匹配特征向量不能被表达成一个高维空间中的向量情况下的问题. ``GenericDescriptorMatcher`` 是一个更加通用的特征描述子接口.它没有关于特征描述子表达的各种假设.每个 :ocv:class:`DescriptorExtractor` 接口对应的特征描述子有一个 ``GenericDescriptorMatcher`` 接口封装.(参考 :ocv:class:`VectorDescriptorMatcher` ). 有一些描述子比如one-way描述子和Ferns也有 ``GenericDescriptorMatcher`` 接口实现,但是没有支持 ``DescriptorExtractor``. GenericDescriptorMatcher ------------------------ .. ocv:class:: GenericDescriptorMatcher 用于提取和匹配特征关键点描述子的抽象接口. 还有一些其他的接口 :ocv:class:`DescriptorExtractor` 和 :ocv:class:`DescriptorMatcher` 可以完成类似功能.但是这些接口只能把特征描述子表示成一个高维空间的向量. ``GenericDescriptorMatcher`` 是一个更加通用的特征描述子接口. ``DescriptorMatcher`` 和 ``GenericDescriptorMatcher`` 有两个匹配方法: 匹配一个图像的特征点与另外一个图像或者另外一个图像集合. :: class GenericDescriptorMatcher { public: GenericDescriptorMatcher(); virtual ~GenericDescriptorMatcher(); virtual void add( const vector& images, vector >& keypoints ); const vector& getTrainImages() const; const vector >& getTrainKeypoints() const; virtual void clear(); virtual void train() = 0; virtual bool isMaskSupported() = 0; void classify( const Mat& queryImage, vector& queryKeypoints, const Mat& trainImage, vector& trainKeypoints ) const; void classify( const Mat& queryImage, vector& queryKeypoints ); /* * Group of methods to match keypoints from an image pair. */ void match( const Mat& queryImage, vector& queryKeypoints, const Mat& trainImage, vector& trainKeypoints, vector& matches, const Mat& mask=Mat() ) const; void knnMatch( const Mat& queryImage, vector& queryKeypoints, const Mat& trainImage, vector& trainKeypoints, vector >& matches, int k, const Mat& mask=Mat(), bool compactResult=false ) const; void radiusMatch( const Mat& queryImage, vector& queryKeypoints, const Mat& trainImage, vector& trainKeypoints, vector >& matches, float maxDistance, const Mat& mask=Mat(), bool compactResult=false ) const; /* * Group of methods to match keypoints from one image to an image set. */ void match( const Mat& queryImage, vector& queryKeypoints, vector& matches, const vector& masks=vector() ); void knnMatch( const Mat& queryImage, vector& queryKeypoints, vector >& matches, int k, const vector& masks=vector(), bool compactResult=false ); void radiusMatch( const Mat& queryImage, vector& queryKeypoints, vector >& matches, float maxDistance, const vector& masks=vector(), bool compactResult=false ); virtual void read( const FileNode& ); virtual void write( FileStorage& ) const; virtual Ptr clone( bool emptyTrainData=false ) const = 0; protected: ... }; GenericDescriptorMatcher::add --------------------------------- 增加图像和对应的特征关键点到训练集合. .. ocv:function:: void GenericDescriptorMatcher::add( const vector& images, vector >& keypoints ) :param images: Image collection. :param keypoints: Point collection. It is assumed that ``keypoints[i]`` are keypoints detected in the image ``images[i]`` . GenericDescriptorMatcher::getTrainImages -------------------------------------------- 返回训练图像集. .. ocv:function:: const vector& GenericDescriptorMatcher::getTrainImages() const GenericDescriptorMatcher::getTrainKeypoints ----------------------------------------------- 返回训练特征关键点集合. .. ocv:function:: const vector >& GenericDescriptorMatcher::getTrainKeypoints() const GenericDescriptorMatcher::clear ----------------------------------- 清空训练集合(图像和特征关键点). .. ocv:function:: void GenericDescriptorMatcher::clear() GenericDescriptorMatcher::train ----------------------------------- 训练特征描述子匹配 .. ocv:function:: void GenericDescriptorMatcher::train() Prepares descriptor matcher, for example, creates a tree-based structure, to extract descriptors or to optimize descriptors matching. GenericDescriptorMatcher::isMaskSupported --------------------------------------------- 如果通用特征描述子匹配支持masking permissible matches,返回 ``true``. .. ocv:function:: void GenericDescriptorMatcher::isMaskSupported() GenericDescriptorMatcher::classify -------------------------------------- Classifies keypoints from a query set. .. ocv:function:: void GenericDescriptorMatcher::classify( const Mat& queryImage, vector& queryKeypoints, const Mat& trainImage, vector& trainKeypoints ) const .. ocv:function:: void GenericDescriptorMatcher::classify( const Mat& queryImage, vector& queryKeypoints ) :param queryImage: Query image. :param queryKeypoints: Keypoints from a query image. :param trainImage: Train image. :param trainKeypoints: Keypoints from a train image. The method classifies each keypoint from a query set. The first variant of the method takes a train image and its keypoints as an input argument. The second variant uses the internally stored training collection that can be built using the ``GenericDescriptorMatcher::add`` method. The methods do the following: #. Call the ``GenericDescriptorMatcher::match`` method to find correspondence between the query set and the training set. #. Set the ``class_id`` field of each keypoint from the query set to ``class_id`` of the corresponding keypoint from the training set. GenericDescriptorMatcher::match ----------------------------------- 对于每个查询集合,对于每个特征关键点寻找最佳匹配. .. ocv:function:: void GenericDescriptorMatcher::match( const Mat& queryImage, vector& queryKeypoints, const Mat& trainImage, vector& trainKeypoints, vector& matches, const Mat& mask=Mat() ) const .. ocv:function:: void GenericDescriptorMatcher::match( const Mat& queryImage, vector& queryKeypoints, vector& matches, const vector& masks=vector() ) :param queryImage: Query image. :param queryKeypoints: Keypoints detected in ``queryImage`` . :param trainImage: Train image. It is not added to a train image collection stored in the class object. :param trainKeypoints: Keypoints detected in ``trainImage`` . They are not added to a train points collection stored in the class object. :param matches: Matches. If a query descriptor (keypoint) is masked out in ``mask`` , match is added for this descriptor. So, ``matches`` size may be smaller than the query keypoints count. :param mask: Mask specifying permissible matches between an input query and train keypoints. :param masks: Set of masks. Each ``masks[i]`` specifies permissible matches between input query keypoints and stored train keypoints from the i-th image. The methods find the best match for each query keypoint. In the first variant of the method, a train image and its keypoints are the input arguments. In the second variant, query keypoints are matched to the internally stored training collection that can be built using the ``GenericDescriptorMatcher::add`` method. Optional mask (or masks) can be passed to specify which query and training descriptors can be matched. Namely, ``queryKeypoints[i]`` can be matched with ``trainKeypoints[j]`` only if ``mask.at(i,j)`` is non-zero. GenericDescriptorMatcher::knnMatch -------------------------------------- 寻找每个查询特征关键点对应的``k``个最佳匹配. .. ocv:function:: void GenericDescriptorMatcher::knnMatch( const Mat& queryImage, vector& queryKeypoints, const Mat& trainImage, vector& trainKeypoints, vector >& matches, int k, const Mat& mask=Mat(), bool compactResult=false ) const .. ocv:function:: void GenericDescriptorMatcher::knnMatch( const Mat& queryImage, vector& queryKeypoints, vector >& matches, int k, const vector& masks=vector(), bool compactResult=false ) The methods are extended variants of ``GenericDescriptorMatch::match``. The parameters are similar, and the the semantics is similar to ``DescriptorMatcher::knnMatch``. But this class does not require explicitly computed keypoint descriptors. GenericDescriptorMatcher::radiusMatch ----------------------------------------- 对于每个查询特征关键点,寻找特定范围内的关键点. .. ocv:function:: void GenericDescriptorMatcher::radiusMatch( const Mat& queryImage, vector& queryKeypoints, const Mat& trainImage, vector& trainKeypoints, vector >& matches, float maxDistance, const Mat& mask=Mat(), bool compactResult=false ) const .. ocv:function:: void GenericDescriptorMatcher::radiusMatch( const Mat& queryImage, vector& queryKeypoints, vector >& matches, float maxDistance, const vector& masks=vector(), bool compactResult=false ) The methods are similar to ``DescriptorMatcher::radius``. But this class does not require explicitly computed keypoint descriptors. GenericDescriptorMatcher::read ---------------------------------- 从文件中读取匹配对象. .. ocv:function:: void GenericDescriptorMatcher::read( const FileNode& fn ) GenericDescriptorMatcher::write ----------------------------------- 写入匹配对象到文件. .. ocv:function:: void GenericDescriptorMatcher::write( FileStorage& fs ) const GenericDescriptorMatcher::clone ----------------------------------- 拷贝匹配. .. ocv:function:: Ptr GenericDescriptorMatcher::clone( bool emptyTrainData ) const :param emptyTrainData: If ``emptyTrainData`` is false, the method creates a deep copy of the object, that is, copies both parameters and train data. If ``emptyTrainData`` is true, the method creates an object copy with the current parameters but with empty train data. OneWayDescriptorMatcher ----------------------- .. ocv:class:: OneWayDescriptorMatcher 封装了类用于计算,匹配,以及对描述子用:ocv:class:`OneWayDescriptorBase` 分类器进行分类. :: class OneWayDescriptorMatcher : public GenericDescriptorMatcher { public: class Params { public: static const int POSE_COUNT = 500; static const int PATCH_WIDTH = 24; static const int PATCH_HEIGHT = 24; static float GET_MIN_SCALE() { return 0.7f; } static float GET_MAX_SCALE() { return 1.5f; } static float GET_STEP_SCALE() { return 1.2f; } Params( int poseCount = POSE_COUNT, Size patchSize = Size(PATCH_WIDTH, PATCH_HEIGHT), string pcaFilename = string(), string trainPath = string(), string trainImagesList = string(), float minScale = GET_MIN_SCALE(), float maxScale = GET_MAX_SCALE(), float stepScale = GET_STEP_SCALE() ); int poseCount; Size patchSize; string pcaFilename; string trainPath; string trainImagesList; float minScale, maxScale, stepScale; }; OneWayDescriptorMatcher( const Params& params=Params() ); virtual ~OneWayDescriptorMatcher(); void initialize( const Params& params, const Ptr& base=Ptr() ); // Clears keypoints stored in collection and OneWayDescriptorBase virtual void clear(); virtual void train(); virtual bool isMaskSupported(); virtual void read( const FileNode &fn ); virtual void write( FileStorage& fs ) const; virtual Ptr clone( bool emptyTrainData=false ) const; protected: ... }; FernDescriptorMatcher --------------------- .. ocv:class:: FernDescriptorMatcher 封装了类用于计算,匹配,以及对描述子用:ocv:class:`FernClassifier` 分类器进行分类. :: class FernDescriptorMatcher : public GenericDescriptorMatcher { public: class Params { public: Params( int nclasses=0, int patchSize=FernClassifier::PATCH_SIZE, int signatureSize=FernClassifier::DEFAULT_SIGNATURE_SIZE, int nstructs=FernClassifier::DEFAULT_STRUCTS, int structSize=FernClassifier::DEFAULT_STRUCT_SIZE, int nviews=FernClassifier::DEFAULT_VIEWS, int compressionMethod=FernClassifier::COMPRESSION_NONE, const PatchGenerator& patchGenerator=PatchGenerator() ); Params( const string& filename ); int nclasses; int patchSize; int signatureSize; int nstructs; int structSize; int nviews; int compressionMethod; PatchGenerator patchGenerator; string filename; }; FernDescriptorMatcher( const Params& params=Params() ); virtual ~FernDescriptorMatcher(); virtual void clear(); virtual void train(); virtual bool isMaskSupported(); virtual void read( const FileNode &fn ); virtual void write( FileStorage& fs ) const; virtual Ptr clone( bool emptyTrainData=false ) const; protected: ... }; VectorDescriptorMatcher ----------------------- .. ocv:class:: VectorDescriptorMatcher 用于匹配特征描述子的类.这个类用于描述子在有限维空间上的向量. :: class CV_EXPORTS VectorDescriptorMatcher : public GenericDescriptorMatcher { public: VectorDescriptorMatcher( const Ptr& extractor, const Ptr& matcher ); virtual ~VectorDescriptorMatcher(); virtual void add( const vector& imgCollection, vector >& pointCollection ); virtual void clear(); virtual void train(); virtual bool isMaskSupported(); virtual void read( const FileNode& fn ); virtual void write( FileStorage& fs ) const; virtual Ptr clone( bool emptyTrainData=false ) const; protected: ... }; Example: :: VectorDescriptorMatcher matcher( new SurfDescriptorExtractor, new BruteForceMatcher > ); 翻译者 ------------- bittnt@ `OpenCV中文网站 `_