之前写过一遍关于学习surf算法的blog:http://blog.csdn.net/sangni007/article/details/7482960

但是代码比较麻烦,而且其中还涉及到flann算法(其中的Random KDTree+KNN),虽然能看明白,但是比较费劲,今天在文档中找到一个简化版本:

1.SurfFeatureDetector detector( minHessian );构造surf检测器;

detector.detect( img_1, keypoints_1 ); detector.detect( img_2, keypoints_2 );检测

2.SurfDescriptorExtractor extractor;提取描述结构

Mat descriptors_1, descriptors_2;

extractor.compute( img_1, keypoints_1, descriptors_1 ); extractor.compute( img_2, keypoints_2, descriptors_2 );

3.BruteForceMatcher< L2<float> > matcher;牛逼的匹配结构啊!!!!可以直接暴力测量距离

std::vector< DMatch > matches;

matcher.match( descriptors_1, descriptors_2, matches );

文档:http://opencv.itseez.com/modules/gpu/doc/feature_detection_and_description.html?highlight=bruteforce#gpu::BruteForceMatcher_GPU

PS:OpenCV 你是在太强悍了!!!只有我想不到,木有你办不到的啊! 我真心跪了!

  1. /**
  2. * @file SURF_descriptor
  3. * @brief SURF detector + descritpor + BruteForce Matcher + drawing matches with OpenCV functions
  4. * @author A. Huaman
  5. */
  6. #include <stdio.h>
  7. #include <iostream>
  8. #include "opencv2/core/core.hpp"
  9. #include "opencv2/features2d/features2d.hpp"
  10. #include "opencv2/highgui/highgui.hpp"
  11. using namespace cv;
  12. using namespace std;
  13. void readme();
  14. /**
  15. * @function main
  16. * @brief Main function
  17. */
  18. int main( int argc, char** argv )
  19. {
  20. //if( argc != 3 )
  21. //{ return -1; }
  22. Mat img_1 = imread( "D:/src.jpg", CV_LOAD_IMAGE_GRAYSCALE );
  23. Mat img_2 = imread( "D:/Demo.jpg", CV_LOAD_IMAGE_GRAYSCALE );
  24. if( !img_1.data || !img_2.data )
  25. { return -1; }
  26. //-- Step 1: Detect the keypoints using SURF Detector
  27. int minHessian = 400;
  28. double t=getTickCount();
  29. SurfFeatureDetector detector( minHessian );
  30. std::vector<KeyPoint> keypoints_1, keypoints_2;
  31. detector.detect( img_1, keypoints_1 );
  32. detector.detect( img_2, keypoints_2 );
  33. //-- Step 2: Calculate descriptors (feature vectors)
  34. SurfDescriptorExtractor extractor;
  35. Mat descriptors_1, descriptors_2;
  36. extractor.compute( img_1, keypoints_1, descriptors_1 );
  37. extractor.compute( img_2, keypoints_2, descriptors_2 );
  38. //-- Step 3: Matching descriptor vectors with a brute force matcher
  39. BruteForceMatcher< L2<float> > matcher;
  40. std::vector< DMatch > matches;
  41. matcher.match( descriptors_1, descriptors_2, matches );
  42. t=getTickCount()-t;
  43. t=t*1000/getTickFrequency();
  44. //-- Draw matches
  45. Mat img_matches;
  46. drawMatches( img_1, keypoints_1, img_2, keypoints_2, matches, img_matches );
  47. cout<<"Cost Time:"<<t<<endl;
  48. //-- Show detected matches
  49. imshow("Matches", img_matches );
  50. waitKey(0);
  51. return 0;
  52. }
  53. /**
  54. * @function readme
  55. */
  56. void readme()
  57. { std::cout << " Usage: ./SURF_descriptor <img1> <img2>" << std::endl; }

图像中match的keypoints没有经过过滤。导致匹配点过多

文档地址:http://opencv.itseez.com/doc/tutorials/features2d/feature_description/feature_description.html?highlight=description

文档中还有一个版本带定位的和过滤Match的,

http://opencv.itseez.com/doc/tutorials/features2d/feature_homography/feature_homography.html?highlight=drawmatchesflags

from: http://blog.csdn.net/yangtrees/article/details/7544133

学习OpenCV——Surf简化版的更多相关文章

  1. 学习OpenCV——ORB简化版&Location加速版

    根据前面surf简化版的结构,重新把ORB检测的代码给简化以下,发现虽然速度一样,确实能省好多行代码,关键是有 BruteForceMatcher<HammingLUT>matcher的帮 ...

  2. 学习OpenCV——Surf(特征点篇)&flann

    Surf(Speed Up Robust Feature) Surf算法的原理                                                             ...

  3. 特征点检测学习_2(surf算法)

    依旧转载自作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 特征点检测学习_2(surf算法) 在上篇博客特征点检测学习_1(sift算法) 中 ...

  4. 学习opencv之路(一)

    先看一下<学习opencv> 找几个demo 学会相机标定 我做的是单目相机的标定.

  5. [纯小白学习OpenCV系列]官方例程00:世界观与方法论

    2015-11-11 ----------------------------------------------------------------------------------- 其实,写博 ...

  6. 《学习OpenCV》中求给定点位置公式

    假设有10个三维的点,使用数组存放它们有四种常见的形式: ①一个二维数组,数组的类型是CV32FC1,有n行,3列(n×3) ②类似①,也可以用一个3行n列(3×n)的二维数组 ③④用一个n行1列(n ...

  7. 对人脑处理视觉的描述(摘《学习OpenCV(中文版)》)

    人脑将视觉信号划分入很多个通道,将各种不同的信息输入你的大脑.你的大脑有一个关注系统,会根据任务识别出图像的重要部分,并做重点分析,而其他部分则分析得较少 .在人类视觉流中存在大量的反馈,但是目前我们 ...

  8. 《学习OpenCV》练习题第五章第二题abc

    代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...

  9. 《学习OpenCV》练习题第五章第一题ab

    这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...

随机推荐

  1. [Cocos2D-x For WP8]CocosDenshion音频播放

    Cocos2D-x的音频分为长时间的背景音乐和短的音效两种,我们可以通过SimpleAudioEngine::sharedEngine()方法来获取音频播放的引擎,然后调用对音频相关的操作方法就可以了 ...

  2. 定义 iOS 方法名等不错的规范

    1.配置视图不应命名为 setxxxx, 而应叫做 showxxxx 2.让按钮高亮不应叫做 showxxx, 而应叫做 highlightedxxx. 3,弹出 toastView 可以用 show ...

  3. C#后台如何获取客户端访问系统型号

    ASP.NET获取客户端.服务器端基础信息 . 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名:P ...

  4. 转自:C#中TextBox水印提示的简单实现

    本文转自: 原作者: js2854 出处: http://js2854.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接 ...

  5. C# 窗体位置 Show和ShowDialog(转)

    CenterParent 窗体在其父窗体中居中. CenterScreen 窗体在当前显示窗口中居中,其尺寸在窗体大小中指定. Manual 窗体的位置由 Location 属性确定. Windows ...

  6. 李洪强iOS经典面试题下

    李洪强iOS经典面试题下 21. 下面的代码输出什么? @implementation Son : Father - (id)init { self = [super init]; if (self) ...

  7. ZK dropEvent简单使用

    前台(Drop.zul) <?page title="拖动测试" contentType="text/html;charset=UTF-8"?> & ...

  8. Runtime Error---Description: An application error occurred on the server....

    [原]Runtime Error---Description: An application error occurred on the server.... 2010-1-7阅读2010 评论3 D ...

  9. thinkphp框架验证码验证一次

    做异步验证验证码,只要验证一次结果正确,拿相同的值再次来对比,返回结果就不正确.我看到论坛中有人说,tp框架只要验证过一次正确后验证码就销毁了.确实是这个效果,但具体的还没深入了解

  10. 设置Oracle时间格式

    ORACLE的DATE类型的显示方式取决于NLS_DATE_FORMAT初始化参数NLS_DATE_FORMAT参数可以在以下几个级别设置1.数据库级别——如果希望所有人都看到某种格式的数据,则在SQ ...