/***好记性不如烂笔头,记下来便于以后复习***/     

特征匹配的结果会得到两个特征集合的对应关系列表。第一组特征集被称为训练集(train),第二组被称为查询集(query)。Flann 在调用匹配函数之前,为了提高匹配速度,训练一个匹配器。训练阶段是为了优化cv::FlannBasedMatcher的性能。train类将会建立特征集的索引树。将 query image 的每一个特征点和 train 匹配器进行匹配,找出最佳匹配;也就是从query image 的特征中逐个去和训练器做匹配,也就是说每一个query image 特征点都会有一个最佳匹配,后期还需要验证这匹配的正确性,可以通过设置截断值来去除误差大的匹配;

去除了误差大的匹配即可以使用 Lowe's策略进行匹配的再一次筛选;

knnMatch()找每个query image特征的K近邻匹配,效率不够高,帧率很低。

Lowe’s算法:为了进一步筛选匹配点,来获取优秀的匹配点,这就是所谓的“去粗取精”。一般会采用Lowe’s算法来进一步获取优秀匹配点。
   为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,SIFT的作者Lowe提出了比较最近邻距离与次近邻距离的SIFT匹配方式:取一幅图像中的一个SIFT关键点,并找出其与另一幅图像中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离得到的比率ratio少于某个阈值T,则接受这一对匹配点。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。显然降低这个比例阈值T,SIFT匹配点数目会减少,但更加稳定,反之亦然。
   Lowe推荐ratio的阈值为0.8,但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio取值在0. 4~0. 6 之间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点,所以建议ratio的取值原则如下:

ratio=0. 4:对于准确度要求高的匹配;

ratio=0. 6:对于匹配点数目要求比较多的匹配;

ratio=0. 5:一般情况下。

Lowe's改进:可以反过来使用最近邻比次近邻,在匹配中可以作为置信度来使用,当满足最近邻比次近邻大于某个值的时候,作为某个条件的判别  置信度;比如可以应用在双目视觉立体匹配中的视差选择与优化环节中(论文正在编写中);

#include "highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/legacy/legacy.hpp"
#include <iostream>  using namespace cv;
using namespace std;int main()
{Mat image01 = imread("g2.jpg", 1);    Mat image02 = imread("g4.jpg", 1);    imshow("p2", image01);imshow("p1", image02);//灰度图转换  Mat image1, image2;cvtColor(image01, image1, CV_RGB2GRAY);cvtColor(image02, image2, CV_RGB2GRAY);//提取特征点    SurfFeatureDetector surfDetector(2000); //海塞矩阵阈值,在这里调整精度,值越大点越少,越精准 vector<KeyPoint> keyPoint1, keyPoint2;surfDetector.detect(image1, keyPoint1);surfDetector.detect(image2, keyPoint2);//特征点描述,为下边的特征点匹配做准备    SurfDescriptorExtractor SurfDescriptor;Mat imageDesc1, imageDesc2;SurfDescriptor.compute(image1, keyPoint1, imageDesc1);SurfDescriptor.compute(image2, keyPoint2, imageDesc2);FlannBasedMatcher matcher;vector<vector<DMatch> > matchePoints;vector<DMatch> GoodMatchePoints;vector<Mat> train_desc(1, imageDesc1);matcher.add(train_desc);matcher.train();matcher.knnMatch(imageDesc2, matchePoints, 2);cout << "total match points: " << matchePoints.size() << endl;// Lowe's algorithm,获取优秀匹配点for (int i = 0; i < matchePoints.size(); i++){if (matchePoints[i][0].distance < 0.6 * matchePoints[i][1].distance){GoodMatchePoints.push_back(matchePoints[i][0]);}}Mat first_match;drawMatches(image02, keyPoint2, image01, keyPoint1, GoodMatchePoints, first_match);imshow("first_match ", first_match);waitKey();return 0;
}

参考博客:

https://blog.csdn.net/xxzxxzdlut/article/details/72930209

https://www.cnblogs.com/wyuzl/p/7816011.html

Flann特征点匹配简述(Lowe's algorithm)相关推荐

  1. 【图像处理】——特征匹配(SIFT特征检测器+FLANN特征匹配方法+KNN近邻最优匹配筛选)——cv.xfeatures2d.SIFT_create()sift.detectAndCompute

    转载请注明地址 目录 1.特征检测和特征匹配方法 (1)特征检测算法 (2)特征匹配算法 (3)各种特征检测算法的比较 2.特征匹配的基本步骤(附带主要的函数) (1)图像预处理--灰度化(模板--查 ...

  2. 【总结】FLANN特征匹配

    工作需要用到FLANN特征匹配技术,在这里记录一些关键知识点. ORB (Oriented FAST and Rotated BRIEF)  算法简介 分为两部分: 特征点提取 -由FAST(Feat ...

  3. Opencv中的“暴力”特征匹配和FLANN特征匹配(python实现)

    文章目录 1.ORB关键点检测,SURF关键点检测,SIFT关键点检测,Shi-Tomasi角点检测,Harris角点检测 2.特征匹配的方法 3.暴力特征匹配 4.特征匹配步骤 (1)创建匹配器 ( ...

  4. OpenCV之feature2d 模块. 2D特征框架(2)特征描述 使用FLANN进行特征点匹配 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 平面物体检测

    特征描述 目标 在本教程中,我们将涉及: 使用 DescriptorExtractor 接口来寻找关键点对应的特征向量. 特别地: 使用 SurfDescriptorExtractor 以及它的函数  ...

  5. 模板匹配,特征点匹配-全

    cnn网络: superpoint 18年的, https://github.com/magicleap/SuperPointPretrainedNetwork cnn图像匹配:权重5m torch ...

  6. 特征点匹配+特征检测方法汇总

    特征点匹配+特征检测方法汇总 特征提取与匹配---SURF:SIFT:ORB:FAST:Harris角点 匹配方法 匹配函数 1. OpenCV提供了两种Matching方式: • Brute-for ...

  7. 结合openCV学习DIP之传统图像特征与匹配

    前言 关于图像的预处理部分参考  结合opencv学习DIP​​​​​​​ 概述 该笔记主要是基于DIP理论➕openCV实现,学习该笔记首先要确保通读DIP理论,并由自己的话描述相关知识,并且掌握o ...

  8. SIFT特征点匹配中KD-tree与Ransac算法的使用

    转自:http://blog.csdn.net/ijuliet/article/details/4471311 Step1:BBF算法,在KD-tree上找KNN.第一步做匹配咯~ 1.什么是KD-t ...

  9. 基于特征点匹配的自适应目标跟踪算法

    基于特征点匹配的自适应目标跟踪算法 2016-01-29 13:11 摘 要:由于实际场景复杂多变,目标在运动过程中往往会出现形变.遮挡等问题,增加了跟踪的难度.为了解决上述问题,提出一种基于特征点匹 ...

  10. OpenCV与FLANN的功能匹配

    OpenCV与FLANN的功能匹配 与FLANN的功能匹配 目标 理论 代码 结果 与FLANN的功能匹配 目标 在本教程中,您将学习如何: 使用cv :: FlannBasedMatcher界面,以 ...

最新文章

  1. python经典好书-新手Python入门经典书籍推荐
  2. 设计模式——门面(外观)模式
  3. linux kernel使用技巧
  4. DELETE ADJACENT DUPLICATES FROM语句的深入研究及应用
  5. SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!
  6. java混淆of_java – 是否有任何级别的混淆可以“欺骗”instanceof?
  7. 像素越多越好?像元的面积越小越好?
  8. Real-Time Rendering 4th 译文《二十一 虚拟现实与增强现实》
  9. 怎样统计PPT演示文稿的字数
  10. EasyTalking微博系统
  11. python多条件求和_使用sumifs进行多条件求和
  12. 【Java】Deprecated 注解
  13. Python - 使用ffmepg批量转换某个文件夹以及所有子文件夹下所有的视频,修改其帧率/码率/分辨率到另一文件夹,并保留原有文件夹结构
  14. 【无代码体验】宜搭车辆管理系统模板试用
  15. Java POI解析Word提取数据存储在Excel
  16. 微信铃声设置教程,怎么设置微信铃声?
  17. 论相对性原理2-洛仑兹坐标变换的数学原理
  18. curator(curator)
  19. 前端工程师需要学习ps 吗_【百度前端工程师面试】前端开发技术要会PS-看准网...
  20. MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示

热门文章

  1. 全球与中国注塑磁体市场竞争策略分析及投资前景研究报告2021-2027年版
  2. 树莓派安装中文拼音输入法和五笔输入法
  3. java 闰年闰月_什么是闰年,闰年和闰月的区别
  4. 二手升腾网络计算机,瘦客户机终端网络计算机专用计算机
  5. 用Now SMS/MMS 发送中国移动彩信
  6. GE、西门子、PTC、SAP、阿里、腾讯、海尔..工业互联网的『未来战争』
  7. c语言碰撞算法,c – 任意大小凸多边形之间碰撞检测的算法
  8. 短除法求最小公倍数c语言,短除法求最小公倍数
  9. 阿里云安全恶意程序检测冠军经验分享(万字长文)
  10. 基于FME实现地铁路径规划