OpenCV 4.4.0 中SIFT专利到期 SIFT方法已经回归主库 使用时 cv::SIFT即可 , SURF还在nofree中 相较于之前版本 头文件不在 #include <opencv2/xfeatures2d.hpp> 而在 #include <opencv2/xfeatures2d/nonfree.hpp>中
opencv3.X以后中SurfFeatureDetector、SurfDescriptorExtractor、BruteForceMatcher这三个的使用方法已经和原先2.4版本前不一样,一般通过指针访问 最好看一下继承关系
老版多用类
SurfFeatureDetector detector(minHessian);//定义一个SurfFeatureDetector(SURF) 特征检测类对象
detector.detect(srcImage1, keypoints_1);
SurfDescriptorExtractor extractor; //定义一个特征点描述子
extractor.compute(srcImage1, keypoints_1, descriptors1);//计算描述符
BruteForceMatcher<L2<float>>matcher;//创建一个暴力匹配器
matcher.match(descriptors1, descriptors2, BFmatches);
新版多用智能指针
Ptr<SURF> detector = SURF::create(minHessian);
detector->detect(img_1, keypoints_1);
Ptr<SURF> extractor = SURF::create();
extractor->compute(img_1, keypoints_1, descriptors_1);
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");//这里填写使用的匹配方式
matcher->match(descriptors_1, descriptors_2, matches);
对于匹配器的调用
static Ptr<DescriptorMatcher> cv::DescriptorMatcher::create(const String & descriptorMatcherType)
descriptorMatcherType | Descriptor matcher type. Now the following matcher types are supported:
|
SiftDescriptorExtractor,有的是uchar类型的,比如说有ORB,BriefDescriptorExtractor。对应float类型的匹配方式有:FlannBasedMatcher,BruteForce<L2<float>>,BruteForce<SL2<float>>,BruteForce<L1<float>>。对应uchar类型的匹配方式有:BruteForce<Hammin>,BruteForce<HammingLUT>。所以ORB和BRIEF特征描述子只能使用BruteForce匹配法。
新版匹配器也常用派生类直接调用
BFMatcher BFmatch;
FlannBasedMatcher FLANNmatch;
https://blog.csdn.net/holybin/article/details/40926315
https://blog.csdn.net/xxzxxzdlut/article/details/72926011?spm=1001.2014.3001.5506