Flann特征点匹配简述(Lowe's algorithm)
/***好记性不如烂笔头,记下来便于以后复习***/
特征匹配的结果会得到两个特征集合的对应关系列表。第一组特征集被称为训练集(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)相关推荐
- 【图像处理】——特征匹配(SIFT特征检测器+FLANN特征匹配方法+KNN近邻最优匹配筛选)——cv.xfeatures2d.SIFT_create()sift.detectAndCompute
转载请注明地址 目录 1.特征检测和特征匹配方法 (1)特征检测算法 (2)特征匹配算法 (3)各种特征检测算法的比较 2.特征匹配的基本步骤(附带主要的函数) (1)图像预处理--灰度化(模板--查 ...
- 【总结】FLANN特征匹配
工作需要用到FLANN特征匹配技术,在这里记录一些关键知识点. ORB (Oriented FAST and Rotated BRIEF) 算法简介 分为两部分: 特征点提取 -由FAST(Feat ...
- Opencv中的“暴力”特征匹配和FLANN特征匹配(python实现)
文章目录 1.ORB关键点检测,SURF关键点检测,SIFT关键点检测,Shi-Tomasi角点检测,Harris角点检测 2.特征匹配的方法 3.暴力特征匹配 4.特征匹配步骤 (1)创建匹配器 ( ...
- OpenCV之feature2d 模块. 2D特征框架(2)特征描述 使用FLANN进行特征点匹配 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 平面物体检测
特征描述 目标 在本教程中,我们将涉及: 使用 DescriptorExtractor 接口来寻找关键点对应的特征向量. 特别地: 使用 SurfDescriptorExtractor 以及它的函数 ...
- 模板匹配,特征点匹配-全
cnn网络: superpoint 18年的, https://github.com/magicleap/SuperPointPretrainedNetwork cnn图像匹配:权重5m torch ...
- 特征点匹配+特征检测方法汇总
特征点匹配+特征检测方法汇总 特征提取与匹配---SURF:SIFT:ORB:FAST:Harris角点 匹配方法 匹配函数 1. OpenCV提供了两种Matching方式: • Brute-for ...
- 结合openCV学习DIP之传统图像特征与匹配
前言 关于图像的预处理部分参考 结合opencv学习DIP 概述 该笔记主要是基于DIP理论➕openCV实现,学习该笔记首先要确保通读DIP理论,并由自己的话描述相关知识,并且掌握o ...
- SIFT特征点匹配中KD-tree与Ransac算法的使用
转自:http://blog.csdn.net/ijuliet/article/details/4471311 Step1:BBF算法,在KD-tree上找KNN.第一步做匹配咯~ 1.什么是KD-t ...
- 基于特征点匹配的自适应目标跟踪算法
基于特征点匹配的自适应目标跟踪算法 2016-01-29 13:11 摘 要:由于实际场景复杂多变,目标在运动过程中往往会出现形变.遮挡等问题,增加了跟踪的难度.为了解决上述问题,提出一种基于特征点匹 ...
- OpenCV与FLANN的功能匹配
OpenCV与FLANN的功能匹配 与FLANN的功能匹配 目标 理论 代码 结果 与FLANN的功能匹配 目标 在本教程中,您将学习如何: 使用cv :: FlannBasedMatcher界面,以 ...
最新文章
- python经典好书-新手Python入门经典书籍推荐
- 设计模式——门面(外观)模式
- linux kernel使用技巧
- DELETE ADJACENT DUPLICATES FROM语句的深入研究及应用
- SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!
- java混淆of_java – 是否有任何级别的混淆可以“欺骗”instanceof?
- 像素越多越好?像元的面积越小越好?
- Real-Time Rendering 4th 译文《二十一 虚拟现实与增强现实》
- 怎样统计PPT演示文稿的字数
- EasyTalking微博系统
- python多条件求和_使用sumifs进行多条件求和
- 【Java】Deprecated 注解
- Python - 使用ffmepg批量转换某个文件夹以及所有子文件夹下所有的视频,修改其帧率/码率/分辨率到另一文件夹,并保留原有文件夹结构
- 【无代码体验】宜搭车辆管理系统模板试用
- Java POI解析Word提取数据存储在Excel
- 微信铃声设置教程,怎么设置微信铃声?
- 论相对性原理2-洛仑兹坐标变换的数学原理
- curator(curator)
- 前端工程师需要学习ps 吗_【百度前端工程师面试】前端开发技术要会PS-看准网...
- MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示
热门文章
- 全球与中国注塑磁体市场竞争策略分析及投资前景研究报告2021-2027年版
- 树莓派安装中文拼音输入法和五笔输入法
- java 闰年闰月_什么是闰年,闰年和闰月的区别
- 二手升腾网络计算机,瘦客户机终端网络计算机专用计算机
- 用Now SMS/MMS 发送中国移动彩信
- GE、西门子、PTC、SAP、阿里、腾讯、海尔..工业互联网的『未来战争』
- c语言碰撞算法,c – 任意大小凸多边形之间碰撞检测的算法
- 短除法求最小公倍数c语言,短除法求最小公倍数
- 阿里云安全恶意程序检测冠军经验分享(万字长文)
- 基于FME实现地铁路径规划