作者:holybin
原文:https://blog.csdn.net/holybin/article/details/40926315
Brute Force匹配和FLANN匹配是opencv二維特征點匹配常見的兩種辦法,分別對應BFMatcher(BruteForceMatcher)和FlannBasedMatcher。BFMatcher的構造函數如下:
C++: BFMatcher::BFMatcher(int normType=NORM_L2, bool crossCheck=false )
Parameters: |
|
FlannBasedMatcher的構造函數如下:
class 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: ... };
二者的區別在於BFMatcher總是嘗試所有可能的匹配,從而使得它總能夠找到最佳匹配,這也是Brute Force(暴力法)的原始含義。而FlannBasedMatcher中FLANN的含義是Fast Library forApproximate Nearest Neighbors,從字面意思可知它是一種近似法,算法更快但是找到的是最近鄰近似匹配,所以當我們需要找到一個相對好的匹配但是不需要最佳匹配的時候往往使用FlannBasedMatcher。當然也可以通過調整FlannBasedMatcher的參數來提高匹配的精度或者提高算法速度,但是相應地算法速度或者算法精度會受到影響。
此外,使用特征提取過程得到的特征描述符(descriptor)數據類型有的是float類型的,比如說SurfDescriptorExtractor,
SiftDescriptorExtractor,有的是uchar類型的,比如說有ORB,BriefDescriptorExtractor。對應float類型的匹配方式有:FlannBasedMatcher,BruteForce<L2<float>>,BruteForce<SL2<float>>,BruteForce<L1<float>>。對應uchar類型的匹配方式有:BruteForce<Hammin>,BruteForce<HammingLUT>。所以ORB和BRIEF特征描述子只能使用BruteForce匹配法。