运行环境:vs2012+opencv320

sift 需要的头文件为 <opencv2/xfeatures2d.hpp>

  1. #include <opencv2/opencv.hpp>
  2. #include <opencv2/xfeatures2d.hpp>
  3.  
  4. using namespace cv;
  5. using namespace std;
  6.  
  7. bool refineMatchesWithHomography(
  8. const std::vector<cv::KeyPoint>& queryKeypoints,
  9. const std::vector<cv::KeyPoint>& trainKeypoints,
  10. float reprojectionThreshold,
  11. std::vector<cv::DMatch>& matches,
  12. cv::Mat& homography)
  13. {
  14. const int minNumberMatchesAllowed = 8;
  15.  
  16. if (matches.size() < minNumberMatchesAllowed)
  17. return false;
  18.  
  19. // Prepare data for cv::findHomography
  20. std::vector<cv::Point2f> srcPoints(matches.size());
  21. std::vector<cv::Point2f> dstPoints(matches.size());
  22.  
  23. for (size_t i = 0; i < matches.size(); i++) {
  24. srcPoints[i] = trainKeypoints[matches[i].trainIdx].pt;
  25. dstPoints[i] = queryKeypoints[matches[i].queryIdx].pt;
  26. }
  27.  
  28. // Find homography matrix and get inliers mask
  29. std::vector<unsigned char> inliersMask(srcPoints.size());
  30. homography = cv::findHomography(srcPoints, dstPoints, CV_FM_RANSAC,reprojectionThreshold, inliersMask);
  31.  
  32. std::vector<cv::DMatch> inliers;
  33. for (size_t i = 0; i < inliersMask.size(); i++) {
  34. if (inliersMask[i])
  35. inliers.push_back(matches[i]);
  36. }
  37.  
  38. matches.swap(inliers);
  39. return matches.size() > minNumberMatchesAllowed;
  40. }
  41.  
  42. bool comp(vector<DMatch>& a,vector<DMatch>& b)
  43. {
  44. return a[0].distance/a[1].distance < b[0].distance/b[1].distance;
  45. }
  46.  
  47. void main()
  48. {
  49. Ptr<xfeatures2d::SIFT>feature=xfeatures2d::SIFT::create();
  50.  
  51. Mat input1 = imread("sift_img\\16.png",1);
  52. Mat input2 = imread("sift_img\\11.png",1);
  53.  
  54. vector<KeyPoint>kp1,kp2;
  55. Mat des1,des2;
  56. Mat output1,output2;
  57.  
  58. feature->detectAndCompute(input1,cv::noArray(),kp1,des1);
  59. drawKeypoints(input1,kp1,output1);
  60.  
  61. feature->detectAndCompute(input2,cv::noArray(),kp2,des2);
  62. drawKeypoints(input2,kp2,output2);
  63.  
  64. vector<DMatch>matches;
  65. vector<vector<DMatch> >Dmatches;
  66. Ptr<cv::DescriptorMatcher> matcher_knn = new BFMatcher();
  67. Ptr<cv::DescriptorMatcher> matcher = new BFMatcher(NORM_L2,true);
  68. matcher->match(des1,des2,matches);
  69.  
  70. matcher_knn->knnMatch(des1,des2,Dmatches,2);
  71. sort(Dmatches.begin(),Dmatches.end(),comp);
  72.  
  73. vector<DMatch> good;
  74. for(int i=0;i<Dmatches.size();i++){
  75. if(Dmatches[i][0].distance < 0.75*Dmatches[i][1].distance)
  76. good.push_back(Dmatches[i][0]);
  77. }
  78.  
  79. Mat imResultOri;
  80. drawMatches(output1, kp1, output2, kp2, matches, imResultOri,CV_RGB(0,255,0), CV_RGB(0,255,0));
  81.  
  82. Mat matHomo;
  83. refineMatchesWithHomography(kp1, kp2, 3, matches, matHomo);
  84. cout << "[Info] Homography T : " << endl << matHomo << endl;
  85.  
  86. Mat imResult;
  87. drawMatches(output1, kp1, output2, kp2, matches, imResult,CV_RGB(0,255,0), CV_RGB(0,255,0));
  88.  
  89. Mat Mgood;
  90. drawMatches(output1, kp1, output2, kp2, good, Mgood,CV_RGB(0,255,0), CV_RGB(0,255,0));
  91.  
  92. imshow("ransc",imResult);
  93. imshow("knn_match",Mgood);
  94. waitKey(0);
  95.  
  96. return;
  97. }

 

[OpenCV] sift demo的更多相关文章

  1. VS2010+Opencv+SIFT以及出现的问题-关于代码sift_3_c的说明

    http://blog.sina.com.cn/s/blog_a6b913e30101dvrt.html 一.前提 安装Opencv,因该版本的SIFT是基于Opencv的. 下载SIFT源码,见Ro ...

  2. RPi 2B python opencv camera demo example

    /************************************************************************************** * RPi 2B pyt ...

  3. Opencv Sift算子特征提取与匹配

    SIFT算法的过程实质是在不同尺度空间上查找特征点(关键点),用128维方向向量的方式对特征点进行描述,最后通过对比描述向量实现目标匹配. 概括起来主要有三大步骤: 1.提取关键点: 2.对关键点附加 ...

  4. OpenCV SIFT原理与源码分析

    http://blog.csdn.net/xiaowei_cqu/article/details/8069548 SIFT简介 Scale Invariant Feature Transform,尺度 ...

  5. python opencv SIFT,获取特征点的坐标位置

    备注:SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向.SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点.边缘点.暗区的亮点及 ...

  6. OpenCV——SIFT特征检测与匹配

    SIFT特征和SURF特征比较 比较项目 SIFT SURF 尺度空间极值检测 使用高斯滤波器,根据不同尺度的高斯差(DOG)图像寻找局部极值 使用方形滤波器,利用海森矩阵的行列式值检测极值,并利用积 ...

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

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

  8. opencv::sift特征提取

    SIFT特征检测介绍 SIFT(Scale-Invariant Feature Transform)特征检测关键特性: -建立尺度空间,寻找极值 -关键点定位(寻找关键点准确位置与删除弱边缘) -关键 ...

  9. python+opencv+sift环境配置教程

    最近在做对应点估计homography,需要用到opencv,c++的接口不如python的接口来的方便 但是在安装python接口的opencv的时候,遇到了各种问题,主要是函数找不到的问题 比如在 ...

随机推荐

  1. Appium自动化测试教程-自学网-SDK

    SDK:软件开发工具包,被软件开发工程师用于特定的软件包.软件框架.硬件平台.操作系统等建立应用软件的开发工具的集合. 因此,Android SDK指的是Android专属的软件开发工具包. 1,安装 ...

  2. UVA1426 Discrete Square Roots

    思路:\(exgcd\) 提交:\(2\)次 错因:输出格式错误OTZ 题解: 求:\(r^2 ≡ x \mod N , 0 \leq r < N\),并且题目会给出 \(x,N\) 和一个合法 ...

  3. PHP mysqli_connect() 函数

    打开一个到 MySQL 服务器的新的连接: mysqli_connect(host,username,password,dbname,port,socket); <?php $con=mysql ...

  4. 007_Linux驱动之_copy_from_user函数

    1. copy_from_user函数的目的是从用户空间拷贝数据到内核空间 2. 解析原型: copy_from_user(void *to, const void __user *from, uns ...

  5. [Luogu] 魔板

    https://www.luogu.org/problemnew/show/P1275 #include <iostream> #include <cstdio> #inclu ...

  6. 【csp模拟赛3】bridge.cpp--矩阵加速递推

    题目描述 穿越了森林,前方有一座独木桥,连接着过往和未来(连接着上一题和下一题...). 这座桥无限长. 小 Q 在独木桥上彷徨了.他知道,他只剩下了 N 秒的时间,每一秒的时间里,他会向 左或向右移 ...

  7. 2016百度之星资格赛 Problem B(大数+组合数)

    题意:度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列.最多200个1. 比如 ...

  8. Flutter实现TabBarView切换页面时每个页面只initState一次

    在  TabBarView  组件中切换页面时,子页面每次均会重新  initState  一次,导致每次都切换页面均会重绘,如下图 如果需要只在第一次进页面  initState  一次,后面再进入 ...

  9. Geth安装和使用

      版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011680118/article/details/82378509 一.简介 Geth是Go ...

  10. jmeter连接oracle数据库

    == 下载及添加这个文件到 这个路径下 连接设置: 测试连接 链接: https://pan.baidu.com/s/1W0YcVf4VLdsjnxv5umKngQ 提取码: np7j