BF和FLANN特征匹配

BF特征点匹配原理:   暴力匹配

(段匹配)

 1 #include <opencv2/opencv.hpp>
 2 #include <opencv2/xfeatures2d.hpp>
 3 #include <iostream>
 4
 5 using namespace cv;
 6 using namespace std;
 7 using namespace cv::xfeatures2d;
 8
 9 int main(int argc, char** argv) {
10     Mat img1 = imread("L:/4-1.jpg", IMREAD_GRAYSCALE);
11     Mat img2 = imread("L:/4.jpg", IMREAD_GRAYSCALE);
12     if (!img1.data || !img2.data) {
13         return -1;
14     }
15     imshow("image1", img1);
16     imshow("image2", img2);
17
18     int minHessian = 400; //海深矩阵参数
19     Ptr<SURF> detector = SURF::create(minHessian);  //SURF指针,创建海深矩阵
20     vector<KeyPoint> keypoints_1;  //创建关键点1
21     vector<KeyPoint> keypoints_2;  //创建关键点2
22
23     Mat descriptor_1, descriptor_2; //描述子1和2
24     detector->detectAndCompute(img1, Mat(), keypoints_1, descriptor_1); //检测图1
25     detector->detectAndCompute(img2, Mat(), keypoints_2, descriptor_2); //检测图2
26
27     BFMatcher matcher(NORM_L2); //BF匹配函数
28     vector<DMatch> matches;     //matches变量
29     matcher.match(descriptor_1, descriptor_2, matches); //matcher函数里match方法
30
31     Mat matchesImg;
32     drawMatches(img1, keypoints_1, img2, keypoints_2, matches, matchesImg);//绘制匹配图像
33     imshow("Descriptor Demo", matchesImg);
34
35     waitKey(0);
36     return 0;
37 }

效果:

FLANN(快速最近邻特征匹配):

快速最近邻逼近搜索函数库(Fast Approximate NearestNeighbor Search Library)

http://www.cs.ubc.ca/research/flann/

参数介绍:

1. vector<DMatch> matches;    

2.drawMatches函数:

 代码如下:

 1 #include <opencv2/opencv.hpp>
 2 #include <opencv2/xfeatures2d.hpp>
 3 #include <iostream>
 4 #include <math.h>
 5
 6 using namespace cv;
 7 using namespace std;
 8 using namespace cv::xfeatures2d;
 9
10 int main(int argc, char** argv) {
11     Mat img1 = imread("L:/4-1.jpg", IMREAD_GRAYSCALE);
12     Mat img2 = imread("L:/4.jpg", IMREAD_GRAYSCALE);
13     if (!img1.data || !img2.data) {
14         return -1;
15     }
16     imshow("object image", img1);
17     imshow("object in scene", img2);
18
19     // surf featurs extraction
20     int minHessian = 400;
21     Ptr<SURF> detector = SURF::create(minHessian);
22     vector<KeyPoint> keypoints_obj;
23     vector<KeyPoint> keypoints_scene;
24     Mat descriptor_obj, descriptor_scene;
25     detector->detectAndCompute(img1, Mat(), keypoints_obj, descriptor_obj);
26     detector->detectAndCompute(img2, Mat(), keypoints_scene, descriptor_scene);
27
28     // matching
29     FlannBasedMatcher matcher; //matcher函数
30     vector<DMatch> matches;
31     /*
32     matches变量,变量的特性有:
33     queryIdx:descriptorsLeft的索引
34     trainIdx:descriptorRight的索引
35     imgIdx:  匹配图像的索引,例如已知一幅图像的sift描述子,与其他十幅图像的描述子进行匹配,
36               找最相似的图像,则imgIdx此时就有用了
37     distance:两个描述子之间的距离
38     */
39     matcher.match(descriptor_obj, descriptor_scene, matches);
40     //matcher.match方法,将两幅图匹配的特征点放入matches
41
42     // find good matched points
43     double minDist = 1000;    //最小值设为最大
44     double maxDist = 0;       //最大值设为最小
45     for (int i = 0; i < descriptor_obj.rows; i++) {
46         double dist = matches[i].distance;
47         if (dist > maxDist) { //以maxDist初值为0,找最大值赋给maxDist
48             maxDist = dist;
49         }
50         if (dist < minDist) {
51             minDist = dist; //以minDist初值为1000,找最小值赋给minDist
52         }
53     }
54     printf("max distance : %f\n", maxDist);  //两幅图中特征点距离最大值
55     printf("min distance : %f\n", minDist);  //两幅图中特征点距离最小值
56     vector<DMatch> goodMatches;
57     for (int i = 0; i < descriptor_obj.rows; i++) {
58         double dist = matches[i].distance;
59         if (dist < max(3 * minDist, 0.02)) {
60    //这里的max(3 * minDist, 0.02)是取3 * minDist与0.02的最大值
61         //一般情况下dist< 3 * minDist就是goodMatches特征点
62             goodMatches.push_back(matches[i]);
63         }
64     }
65
66     Mat matchesImg;
67     drawMatches(img1, keypoints_obj, img2, keypoints_scene, goodMatches, matchesImg,
68                 Scalar::all(-1),Scalar::all(-1), vector<char>(),
69                  DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
70     /*drawMatches函数:
71         1. img1 – 源图像1
72         2. keypoints1 –源图像1的特征点.
73         3. img2 – 源图像2.
74         4. keypoints2 – 源图像2的特征点
75         5. matches1to2 – 源图像1的特征点匹配源图像2的特征点[matches[i]] .
76         6. outImg – 输出图像具体由flags决定.
77         7. matchColor – 匹配的颜色(特征点和连线), 若matchColor == Scalar::all(-1),颜色随机.
78         8. singlePointColor – 单个点的颜色,即未配对的特征点,若matchColor == Scalar::all(-1),颜色随机.
79            matchesMask – Mask决定哪些点将被画出,若为空,则画出所有匹配点.
80         9. flags – Fdefined by DrawMatchesFlags.
81     */
82     imshow("Flann Matching Result", matchesImg);
83
84     waitKey(0);
85     return 0;
86 }

结果:

总结:

学会了一种在数组中找最大最小值得方法:(冒泡排序)

 1 double minDist = 1000;    //最小值设为最大
 2     double maxDist = 0;       //最大值设为最小
 3     for (int i = 0; i < descriptor_obj.rows; i++) {
 4         double dist = matches[i].distance;
 5         if (dist > maxDist) { //以maxDist初值为0,找最大值赋给maxDist
 6             maxDist = dist;
 7         }
 8         if (dist < minDist) {
 9             minDist = dist; //以minDist初值为1000,找最小值赋给minDist
10         }
11     }
12     printf("max distance : %f\n", maxDist);  //两幅图中特征点距离最大值
13     printf("min distance : %f\n", minDist);  //两幅图中特征点距离最小值

原文地址:https://www.cnblogs.com/Jack-Elvis/p/11953103.html

时间: 2024-08-29 18:29:13

BF和FLANN特征匹配的相关文章

OpenCV学习笔记[5]FLANN特征匹配

OpenCV学习笔记:FLANN特征匹配 本次给出FLANN特征匹配的Java实现. [简介] 特征匹配记录下目标图像与待匹配图像的特征点(KeyPoint),并根据特征点集合构造特征量(descriptor),对这个特征量进行比较.筛选,最终得到一个匹配点的映射集合.我们也可以根据这个集合的大小来衡量两幅图片的匹配程度. 特征匹配与模板匹配不同,由于是计算特征点集合的相关度,转置操作对匹配影响不大,但它容易受到失真.缩放的影响. [特征匹配] FeatureMatching.java: imp

Robotics Lab3 ——图像特征匹配、跟踪与相机运动估计

Robotics Lab3 --图像特征匹配.跟踪与相机运动估计 图像特征匹配 图像特征点 携带摄像头的机器人在运动过程中,会连续性地获取多帧图像,辅助其感知周围环境和自身运动.时间序列上相连的两幅或多幅图像,通常存在相同的景物,只是它们在图像中的位置不同.而位置的变换恰恰暗含了相机的运动,这时就需要相邻图像间的相似性匹配. 选取一大块图像区域进行运动估计是不可取的.已知图像在计算机内部是以数字矩阵的形式存储的,[如灰度图的每个元素代表了单个像素的灰度值].而对于点的提取和匹配较为方便,且和数字

OpenCV图像Surf与flann特征点(转载)

Surf(Speed Up Robust Feature) Surf算法的原理                                                                            1.构建Hessian矩阵构造高斯金字塔尺度空间 其实surf构造的金字塔图像与sift有很大不同,就是因为这些不同才加快了其检测的速度.Sift采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像.Hessian矩阵是Surf算法的核心,为了方便运

特征匹配篇

1. ORB特征匹配 BruteForce-Hamming匹配 //使用ORB特征匹配两张图片,并进行运行时间,对称性测试,ratio测试 #include <iostream> #include <ctime> //#include <dirent.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/non

特征检测和特征匹配方法

一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点.计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要.这篇文章我总结了视觉领域最常用的几种特征点以及特征匹配的方法. 在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用, 包括目标识别. 图像配准. 视觉跟踪. 三维重建等. 这个概念的原理是, 从图像中选取某些特征点并对图像进行局部分析,而非观察整幅图像. 只要图像中有足够多可检

OpenCV探索之路(二十三):特征检测和特征匹配方法汇总

http://www.cnblogs.com/skyfsm/p/7401523.html 一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点.计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要.这篇文章我总结了视觉领域最常用的几种特征点以及特征匹配的方法. 在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用, 包括目标识别. 图像配准. 视觉跟踪. 三维重建等. 这个概念的原理是

【特征匹配】SIFT原理之KD树+BBF算法解析

继上一篇中已经介绍了SIFT原理点击打开链接,最后得到了一系列特征点,每个特征点对应一个128维向量.假如现在有两副图片都已经提取到特征点,现在要做的就是匹配上相似的特征点. 相似性查询有两种基本方式:1.范围查询:即给点查询点和查询阈值,从数据集中找出所有与查询点距离小于阈值的点. 2.K近邻查询:给点查询点及正整数K,从数据集中找到与查询点最近的K个数据,当K=1时,就是最近邻查询. 特征匹配算子可以分为两类:1.穷举法:即将数据集中的点与查询点逐一计算距离,如果图1提取到N1个特征点,图2

OpenCV2:特征匹配及其优化

在OpenCV2简单的特征匹配中对使用OpenCV2进行特征匹配的步骤做了一个简单的介绍,其匹配出的结果是非常粗糙的,在这篇文章中对使用OpenCV2进行匹配的细化做一个简单的总结.主要包括以下几个内容: DescriptorMatcher DMatcher KNN匹配 计算两视图的基础矩阵F,并细化匹配结果 计算两视图的单应矩阵H,并细化匹配结果 DescriptorMatcher 和 DMatcher DescriptorMatcher是匹配特征向量的抽象类,在OpenCV2中的特征匹配方法

[翻译]鲁棒的尺度不变特征匹配在遥感图像配准中应用(Robust Scale-Invariant Feature Matching for Remote Sensing Image Registration)

李乔亮,汪国有,刘建国,会员,IEEE,和陈少波 2008年8月7日接收;2008年10月22日和2008年11月27日修改.2009年2月2日首版:当前版本出版于2009年4月17日.本项工作由中国国家基础研究项目60672060资助. 中国湖北省武汉市华中科技大学模式识别与人工智能国家重点实验室,邮编430074(邮箱:[email protected];   [email protected];  [email protected];  [email protected]) 数字对象识别编