使用FLANN进行特征点匹配

目标

在本教程中我们将涉及以下内容:

  • 使用 FlannBasedMatcher 接口以及函数 FLANN 实现快速高效匹配( 快速最近邻逼近搜索函数库(Fast Approximate Nearest Neighbor Search Library) )

理论

代码

这个教程的源代码如下所示。你还可以从 以下链接下载得到源代码

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include "opencv2/core/core.hpp"
  4. #include "opencv2/features2d/features2d.hpp"
  5. #include "opencv2/highgui/highgui.hpp"
  6.  
  7. using namespace cv;
  8.  
  9. void readme();
  10.  
  11. /** @function main */
  12. int main( int argc, char** argv )
  13. {
  14. if( argc != 3 )
  15. { readme(); return -1; }
  16.  
  17. Mat img_1 = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
  18. Mat img_2 = imread( argv[2], CV_LOAD_IMAGE_GRAYSCALE );
  19.  
  20. if( !img_1.data || !img_2.data )
  21. { std::cout<< " --(!) Error reading images " << std::endl; return -1; }
  22.  
  23. //-- Step 1: Detect the keypoints using SURF Detector
  24. int minHessian = 400;
  25.  
  26. SurfFeatureDetector detector( minHessian );
  27.  
  28. std::vector<KeyPoint> keypoints_1, keypoints_2;
  29.  
  30. detector.detect( img_1, keypoints_1 );
  31. detector.detect( img_2, keypoints_2 );
  32.  
  33. //-- Step 2: Calculate descriptors (feature vectors)
  34. SurfDescriptorExtractor extractor;
  35.  
  36. Mat descriptors_1, descriptors_2;
  37.  
  38. extractor.compute( img_1, keypoints_1, descriptors_1 );
  39. extractor.compute( img_2, keypoints_2, descriptors_2 );
  40.  
  41. //-- Step 3: Matching descriptor vectors using FLANN matcher
  42. FlannBasedMatcher matcher;
  43. std::vector< DMatch > matches;
  44. matcher.match( descriptors_1, descriptors_2, matches );
  45.  
  46. double max_dist = 0; double min_dist = 100;
  47.  
  48. //-- Quick calculation of max and min distances between keypoints
  49. for( int i = 0; i < descriptors_1.rows; i++ )
  50. { double dist = matches[i].distance;
  51. if( dist < min_dist ) min_dist = dist;
  52. if( dist > max_dist ) max_dist = dist;
  53. }
  54.  
  55. printf("-- Max dist : %f \n", max_dist );
  56. printf("-- Min dist : %f \n", min_dist );
  57.  
  58. //-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist )
  59. //-- PS.- radiusMatch can also be used here.
  60. std::vector< DMatch > good_matches;
  61.  
  62. for( int i = 0; i < descriptors_1.rows; i++ )
  63. { if( matches[i].distance < 2*min_dist )
  64. { good_matches.push_back( matches[i]); }
  65. }
  66.  
  67. //-- Draw only "good" matches
  68. Mat img_matches;
  69. drawMatches( img_1, keypoints_1, img_2, keypoints_2,
  70. good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
  71. vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
  72.  
  73. //-- Show detected matches
  74. imshow( "Good Matches", img_matches );
  75.  
  76. for( int i = 0; i < good_matches.size(); i++ )
  77. { printf( "-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }
  78.  
  79. waitKey(0);
  80.  
  81. return 0;
  82. }
  83.  
  84. /** @function readme */
  85. void readme()
  86. { std::cout << " Usage: ./SURF_FlannMatcher <img1> <img2>" << std::endl; }

解释

结果

  1. 这里是第一张图特征点检测结果:

  2. 此外我们通过控制台输出FLANN匹配关键点结果:

翻译者

Shuai Zheng, <kylezheng04@gmail.com>, http://www.cbsr.ia.ac.cn/users/szheng/

from: http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html#feature-flann-matcher

OpenCV使用FLANN进行特征点匹配的更多相关文章

  1. OpenCV 使用FLANN进行特征点匹配

    #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #inclu ...

  2. 《opencv学习》 之 特征检测与匹配

    这几天学习SURF特征检测,直接看的视频和书本有点吃不消,现在是基本看懂了,如果写博客记录没有必要,因为网上都差不多,笔记都在书上了,以下是个人认为比较浅显易懂的文章,当然海有很多好文章我没看到. 看 ...

  3. sift、surf、orb 特征提取及最优特征点匹配

    目录 sift sift特征简介 sift特征提取步骤 surf surf特征简介 surf特征提取步骤 orb orb特征简介 orb特征提取算法 代码实现 特征提取 特征匹配 附录 sift si ...

  4. Opencv中使用Surf特征实现图像配准及对透视变换矩阵H的平移修正

    图像配准需要将一张测试图片按照第二张基准图片的尺寸.角度等形态信息进行透视(仿射)变换匹配,本例通过Surf特征的定位和匹配实现图像配准. 配准流程: 1. 提取两幅图像的Surf特征 2. 对Sur ...

  5. Opencv Sift和Surf特征实现图像无缝拼接生成全景图像

    Sift和Surf算法实现两幅图像拼接的过程是一样的,主要分为4大部分: 1. 特征点提取和描述 2. 特征点配对,找到两幅图像中匹配点的位置 3. 通过配对点,生成变换矩阵,并对图像1应用变换矩阵生 ...

  6. 第二篇 特征点匹配以及openvslam中的相关实现详解

    配置文件 在进入正题之前先做一些铺垫,在openvslam中,配置文件是必须要正确的以.yaml格式提供,通常需要指明使用的相机模型,ORB特征检测参数,跟踪参数等. #==============# ...

  7. 【macOS】 在OpenCV下训练Haar特征分类器

    本教程基于以下环境 macOS 10.12.6,OpenCV 3.3.0,python 3.6.由于网上基于masOS系统的教程太少,想出一篇相关教程造福大家-本文旨在学习如何在opencv中基于ha ...

  8. OpenCV教程(47) sift特征和surf特征

         在前面三篇教程中的几种角检测方法,比如harris角检测,都是旋转无关的,即使我们转动图像,依然能检测出角的位置,但是图像缩放后,harris角检测可能会失效,比如下面的图像,图像放大之前可 ...

  9. opencv surf特征点匹配拼接源码

    http://blog.csdn.net/huixingshao/article/details/42672073 /** * @file SURF_Homography * @brief SURF ...

随机推荐

  1. oracle 12C安装问题

    1. 先弄好c$ share的问题  2. 测试一下 c$ share 是否成功. 方法是在cmd里打net use \\localhost\c$ 失败会是这样子...: 系统错误53  The ne ...

  2. <node.js爬虫>制作教程

    前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样初学node.js的朋友. 目标:爬取 http://tweixin.yueyishu ...

  3. webpack2.0构建vue2.0超详细精简版

    原文地址:http://blog.csdn.net/dahuzix/article/details/55549387 npm init -y 初始化项目 安装各种依赖项 npm install --s ...

  4. LoadRunner监控Linux资源

    一.LoadRunner监控Linux资源 (一).准备工作 首先,监视Linux一定要有rstatd这个守护进程,有的Linux版本里也有可能是rpc.rstatd这里只是名字不同而已,功能是一样的 ...

  5. Scrollify – jQuery全屏滚动插件

    和 fullPage.js 一样,Scrollify 也是一款基于 jQuery 的全屏滚动插件.跟 fullPage.js 相比,Scrollify 更加小巧,压缩后不足 4KB.但功能上不如 fu ...

  6. HDU 6031 Innumerable Ancestors

    树状数组,倍增,枚举,$dfs$序. 对于每一次的询问,可以枚举$B$集合中的所有点,对于每一个点,在树上二分$LCA$,找到最低的更新答案. 判断是否是$LCA$可以搞个$dfs$序,将$A$集合中 ...

  7. 洛谷P3803 【模板】多项式乘法 [NTT]

    题目传送门 多项式乘法 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: 第一行2个正整数n,m. 接下来一行n+1个数字, ...

  8. Java常用工具类之自定义访问对象

    package com.wazn.learn.util; import javax.servlet.http.HttpServletRequest; /** * 自定义访问对象工具类 * * 获取对象 ...

  9. Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)

    题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...

  10. 洛谷——P1907 设计道路

    P1907 设计道路 题目描述 Caesar远征高卢回来后,对你大加赞赏,他亲自来到Genoa视察. Genoa在你的建设下变得无比繁荣,由于财政收入的增加,你为城市修建了交通系统.古罗马的交通系统由 ...