struct DMatch 關鍵點描述符比對結果存儲結構。比對結果包括查詢描述符的索引,訓練描述符的索引,訓練圖像的索引和描述符之間的距離.
struct DMatch
{
DMatch() : queryIdx(-1), trainIdx(-1), imgIdx(-1),
distance(std::numeric_limits<float>::max()) {}
DMatch( int _queryIdx, int _trainIdx, float _distance ) :
queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(-1),
distance(_distance) {}
DMatch( int _queryIdx, int _trainIdx, int _imgIdx, float _distance ) :
queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(_imgIdx),
distance(_distance) {}
int queryIdx; // query descriptor index
int trainIdx; // train descriptor index
int imgIdx; // train image index
float distance;
// less is better
bool operator<( const DMatch &m ) const;
};
class DescriptorMatcher : public Algorithm 用于比對關鍵點描述符的抽象基類。有兩種比對方法,将一幅圖像的描述符與另一幅圖像進行比對,或與一個圖像集進行比對。
class DescriptorMatcher
{
public:
virtual ~DescriptorMatcher();
virtual void add( const vector<Mat>& descriptors );
const vector<Mat>& getTrainDescriptors() const;
virtual void clear();
bool empty() const;
virtual bool isMaskSupported() const = 0;
virtual void train();
/*
* Group of methods to match descriptors from an image pair.
*/
void match( const Mat& queryDescriptors, const Mat& trainDescriptors,
vector<DMatch>& matches, const Mat& mask=Mat() ) const;
void knnMatch( const Mat& queryDescriptors, const Mat& trainDescriptors,
vector<vector<DMatch> >& matches, int k,
const Mat& mask=Mat(), bool compactResult=false ) const;
void radiusMatch( const Mat& queryDescriptors, const Mat& trainDescriptors,
vector<vector<DMatch> >& matches, float maxDistance,
const Mat& mask=Mat(), bool compactResult=false ) const;
/*
* Group of methods to match descriptors from one image to an image set.
*/
void match( const Mat& queryDescriptors, vector<DMatch>& matches,
const vector<Mat>& masks=vector<Mat>() );
void knnMatch( const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
int k, const vector<Mat>& masks=vector<Mat>(),
bool compactResult=false );
void radiusMatch( const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
float maxDistance, const vector<Mat>& masks=vector<Mat>(),
bool compactResult=false );
virtual void read( const FileNode& );
virtual void write( FileStorage& ) const;
virtual Ptr<DescriptorMatcher> clone( bool emptyTrainData=false ) const = 0;
static Ptr<DescriptorMatcher> create( const string& descriptorMatcherType );
protected:
vector<Mat> trainDescCollection;
...
};
DescriptorMatcher::add 向訓練描述符集中添加描述符。如果trainDescCollection不是空的,新的描述符将添加到已存在的描述符集中。
DescriptorMatcher::getTrainDescriptors 傳回訓練描述符集trainDescCollection的引用
DescriptorMatcher::clear 清空訓練描述符集
DescriptorMatcher::empty 訓練描述符集為空時傳回true
DescriptorMatcher::isMaskSupported 描述符比對子是否支援比對
DescriptorMatcher::train 訓練一個描述符比對子
DescriptorMatcher::match 為查詢集中的每一個描述符找到最比對的結果
DescriptorMatcher::knnMatch 為查詢集中的每一個描述符找到最比對的k個結果
DescriptorMatcher::radiusMatch 為每一個查詢描述符,找到不大于指定距離的描述符
DescriptorMatcher;:clone 拷貝比對子
DescriptorMatcher::create 建立一個給定預設參數的類型的描述符比對子
class BFMatcher : public DescriptorMatcher Brute-force描述符比對子。該比對子一一在一個集合中查找與另一個集合中的每一個描述符最為接近的描述符,該比對子支援掩膜比對。
class FlannBasedMatcher : public DescriptroMatcher Flann-based 描述符比對子。該比對子在訓練描述符集中訓練出flann::Index_,并調用它的nearest search method 找到最佳比對。是以,該比對子在比對一個較大的訓練集時應該比brute-force更快。該比對子不支援掩膜比對。
lass FlannBasedMatcher : public DescriptorMatcher
{
public:
FlannBasedMatcher(
const Ptr<flann::IndexParams>& indexParams=new flann::KDTreeIndexParams(),
const Ptr<flann::SearchParams>& searchParams=new flann::SearchParams() );
virtual void add( const vector<Mat>& descriptors );
virtual void clear();
virtual void train();
virtual bool isMaskSupported() const;
virtual Ptr<DescriptorMatcher> clone( bool emptyTrainData=false ) const;
protected:
...
};
參考:
1、OpenCV Documentationfeature2d 2D Features Framework:http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html?highlight=flannbasedmatcher#flannbasedmatcher