Opencv学习笔记(六)SURF学习笔记

原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7392345

本人挺菜的,肯定有非常多错误纰漏之处 ,希望大家不吝指正。

看了harris角点检測之后,開始研究SURF角点检測,发现挺复杂的,一时也仅仅了解了大概,把了解的东西总结下,以便下次深入学习。

SURF角点检測算法是对SIFT的一种改进,主要体如今速度上,效率更高。它和SIFT的主要差别是图像多尺度空间的构建方法不同。

在计算视觉领域,尺度空间被象征性的表述为一个图像金字塔,向下降採样一般用高斯金字塔。当中,输入图像函数重复与高斯函数的核卷积并重复对其进行二次抽样,这样的方法主要用于SIFT算法的实现,但每层图像依赖于原图像(当前尺度可能和原图象尺度相差非常大,这时候再那原图像卷积确实有点二了),而且图像须要重设尺寸,因此,这样的计算方法运算量较大。SURF算法对积分图像进行操作,卷积仅仅和前一幅图像有关,其降採样的方法是申请添加图像核的尺寸,这也是SIFT算法与SURF算法在使用金字塔原理方面的不同。SURF算法同意尺度空间多层图像同一时候被处理,不需对图像进行二次抽样,从而提高算法性能。

其他方面的差别,以我菜鸟级的认识,差不大多。

附上两篇SIFT相关的博文,讲得还是比較透彻的,两篇结合起来看基本能明确其原理。

两篇讲的东西有点出入,只是对比着看还是能找出问题的,当然啃论文最easy找出问题了。

SIFT简单介绍:http://www.360doc.com/content/11/1230/23/3054335_176200661.shtml

SIFT算法心得:http://www.360doc.com/content/11/1207/17/3054335_170430459.shtml

其它博文:

SIFT/SURF算法的深入剖析——谈SIFT的精妙与不足:http://hi.baidu.com/xiaoduo170/blog/item/a22bcc1c2349708286d6b636.html

SIFT/SURF系列:http://www.yongblog.com/archives/tag/surf%E7%AE%97%E6%B3%95

SURF论文和源代码(论文讲得非常具体,代码c++实现):

http://download.csdn.net/detail/crzy_sparrow/4171374

opencv小试SURF算法:

#include "opencv2/opencv.hpp"
 
int main(){
    cv::Mat  image, image1 = cv::imread ("test.jpg");
    //灰度变换
    cv::cvtColor (image1,image,CV_BGR2GRAY);
    std::vector<cv::KeyPoint> keypoints;
    cv::SurfFeatureDetector surf(2500);
    surf.detect (image,keypoints);
    cv::drawKeypoints (image,keypoints,image,cv::Scalar::all (255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

    cv::namedWindow ("surf");
    cv::imshow ("surf",image);
    cv::waitKey (0);
    return 0;
}

測试结果:

标记圈的半径长短和特征点所在尺度有关,那条半径是特征点的方向。

SIFT算法的教程、源代码及应用软件

1、ubc:DAVID LOWE---SIFT算法的创始人,两篇巨经典

http://www.cs.ubc.ca/~lowe/

2、cmu:YanKe---PCASIFT,总结的SIFT方面的文章

http://www.andrew.cmu.edu/user/yke/

3、ubc:M.BROWN---SIFT算法用于图像拼接的经典应用autopano-sift,包含一个SIFTLIB库

http://www.cs.ubc.ca/~mbrown/autostitch/autostitch.html

http://www.cs.ubc.ca/~mbrown/panorama/panorama.html

4、toronto:Jepson---Matlab SIFT tutorial, 超级超级超级经典~

http://www.cs.toronto.edu/~jepson/csc2503/

5、ucla:Vedaldi---加州大学一个博士生编的Matlab SIFT tutorial

http://www.cs.ucla.edu/~vedaldi/

6.http://en.wikipedia.org/wiki/Scale-inva ... _transform

7. 大牛整理的计算机视觉分类

http://www.cs.ubc.ca/~lowe/vision.html

8. http://note.sonots.com/SciSoftware/SIFT.html

9.提到了计算变换矩阵的RANSAC法

http://web.engr.oregonstate.edu/~hess/index.html

10. 仿射不变特征点检測,提到了性能评价的方法

http://www.robots.ox.ac.uk/~vgg/research/affine/

11. 一个日本人,挺牛的

http://note.sonots.com/

12. PCA-SIFT

http://www.cs.cmu.edu/~yke/pcasift/

13 opencv sift

http://web.engr.oregonstate.edu/~hess/index.html

14 matlab sift

http://www.vlfeat.org/~vedaldi/code/sift.html

http://www.vlfeat.org/overview/sift.html

15 Improve Scale Invariant Feature Transform (SIFT) 斯坦福

http://robots.stanford.edu/cs223b04/project9.html

16 Known implementations of SIFT    mit

http://people.csail.mit.edu/albert/ladypack/wiki/index.php/Known_implementations_of_SIFT

Opencv学习笔记(六)SURF学习笔记,布布扣,bubuko.com

时间: 2024-10-09 20:43:09

Opencv学习笔记(六)SURF学习笔记的相关文章

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

《Linux内核分析》第六周学习笔记

<Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时 撰写博客时间:2小时] [学习内容:进程创建的过程.使用gdb跟踪分析内核处理函数sys_clone] 一.进程的描述 1.1 进程描述符task_struct数据结构(一) 1. 进程控制块PCB——task_struct 为了管理进程,内核

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

Linux System Programming 学习笔记(六) 进程调度

1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进程调度器需要使 处理器使用率最大化,并且提供 使多个进程并发执行的虚拟 Deciding which processes run, when, and for how long is the process scheduler's fundamental responsibility. 时间片:th

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样:

laravel3学习笔记(六)

原作者博客:ieqi.net ==================================================================================================== ORM Laravel3中MVC体系中Model里最重要的组成部分无疑是ORM了,ORM — object-relational mapper — 将数据操作面向对象化,使得整个web框架的核心风格统一,降低整体复杂度,为开发者提供便利. Laravel3中的ORM叫

compass General 常用api学习[Sass和compass学习笔记]

compass 中一些常用api 包括一些浏览器hack @import "compass/utilities/general" Clearfix Clearfix 是用来清除浮动 float 造成的内容问题,以前用clear 方法可以解决,通过查看Clearfix 的源码发现对与高版本的浏览器其实已经可以不用了 ? 1 2 3 4 @mixin clearfix {   overflow: hidden;   @include has-layout; } 用overflow 就可以了