opencv笔记--SURF
SURF(Speeded-Up Robust Features) 是对 SIFT 得改进,相对于 SIFT,SURF 利用积分图像与盒函数模拟 DoG,提升了计算速度;同时,使用了一种不用于 SIFT 的特征描述方案。
在 SIFT 中,检测尺度空间极值使用了 DoG 响应,SURF 做了如下改进:
1)首先求原图像的积分图像,使用积分图像可以求任意尺度盒函数(Box Filter)响应;
2)使用 Box Fitler 代替 DoG,下图给出了垂直方向与xy方向的 Box Filter,使用积分图像求任意尺寸响应时间都是固定的;

3)在
空间寻找极值作为候选特征点,定义 Hessian 矩阵
,其中,G 为高斯函数,I 为图像函数;
剔除 Det(H) 小于某固定值的候选特征点,得到较好的极值点;
4)使用小波函数计算特征点附近响应,该响应仍然可在积分图像上计算;然后以 60 度为步长在圆形上滑动,求每个窗口响应和并将响应和最大方向作为主方向;

5)将特征点区域分为 4 * 4 小区域,在小区域内再次应用小波函数,并分别求出响应和,可构成向量
,最终构成 4 * 4 * 4 = 64 维特征向量;
一种扩展方式是区分 dx,dy 方向,分别统计 dy > 0 时对应的 dx 求和,dy < 0 时对应的 dx 求和...,这样将 v 扩展为 8 维向量,最终形成 4 * 4 * 8 = 128 维特征向量;
opencv 提供了 SURF 实现,其构造函数如下:
SURF(double hessianThreshold, int nOctaves=4, int nOctaveLayers=2, bool extended=true, bool upright=false);
hessianThreshold:当候选特征点的 Hessian 矩阵行列式值小于该值时,忽略该候选特征点;
nOctaves:表示高斯金字塔层数,当层数越多时,可检测到更粗的特征点;
nOctaveLayers:检测尺度空间上极值使用层数为 nOctaveLayers + 3;
extended:是否使用扩展特征描述,默认特征点描述向量为64维,扩展特征点描述向量为128维;
upright:当特征点方向不改变时,在描述特征点时可不计算特征点主方向;
SURF 特征匹配代码与 SIFT 基本一致,如下:
1 cv::Mat img1 = cv::imread("a.jpg", cv::IMREAD_GRAYSCALE);
2 cv::Mat img2 = cv::imread("b.jpg", cv::IMREAD_GRAYSCALE);
3
4 cv::SurfFeatureDetector detector(2000);
5 std::vector<cv::KeyPoint> keypoints1, keypoints2;
6 cv::Mat descriptors1, descriptors2;
7 detector.operator()(img1, cv::noArray(), keypoints1, descriptors1);
8 detector.operator()(img2, cv::noArray(), keypoints2, descriptors2);
9
10 cv::BFMatcher matcher(cv::NORM_L2);
11 std::vector<DMatch> matches;
12 matcher.match(descriptors1, descriptors2, matches);
13
14 cv::Mat img_matches;
15 cv::drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
16 cv::imwrite("c.jpg", img_matches);
17
18 double min_dist = 100;
19
20 for (int i = 0; i < matches.size(); i++)
21 {
22 double dist = matches[i].distance;
23 if (dist < min_dist) min_dist = dist;
24 }
25
26
27 // Draw only "good" matches (i.e. whose distance is less than 2*min_dist,
28 // or a small arbitary value ( 0.02 )
29 std::vector< DMatch > good_matches;
30 for (int i = 0; i < matches.size(); i++)
31 {
32 if (matches[i].distance <= max(2 * min_dist, 0.02))
33 {
34 good_matches.push_back(matches[i]);
35 }
36 }
37
38 cv::drawMatches(img1, keypoints1, img2, keypoints2, good_matches, img_matches);
39 cv::imwrite("d.jpg", img_matches);


参考资料 SURF: Speeded Up Robust Features Herbert Bay & Tinne Tuylelaars & Luc Van Gool
Learning OpenCV 3 Adrian Kaehler & Gary Bradski
opencv笔记--SURF的更多相关文章
- opencv笔记6:角点检测
time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...
- OpenCV笔记大集锦(转载)
整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...
- opencv笔记5:频域和空域的一点理解
time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...
- opencv笔记4:模板运算和常见滤波操作
time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...
- opencv笔记3:trackbar简单使用
time:2015年 10月 03日 星期六 13:54:17 CST # opencv笔记3:trackbar简单使用 当需要测试某变量的一系列取值取值会产生什么结果时,适合用trackbar.看起 ...
- opencv笔记2:图像ROI
time:2015年 10月 03日 星期六 12:03:45 CST # opencv笔记2:图像ROI ROI ROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区 ...
- opencv笔记1:opencv的基本模块,以及环境搭建
opencv笔记1:opencv的基本模块,以及环境搭建 安装系统 使用fedora22-workstation-x86_64 安装opencv sudo dnf install opencv-dev ...
- opencv提取surf特征点出现的错误
opencv实现surf特征的提取.本来是一个非常easy的代码,结果我执行时却出现了各种错误,以下来谈谈我出现的错误及问题的解决过程. 首先,我把提取surf特征的过程整合成了一个函数,我单独建立一 ...
- OpenCV图像Surf与flann特征点(转载)
Surf(Speed Up Robust Feature) Surf算法的原理 ...
随机推荐
- JWT原理及实现
wt(JSON Web Tokens),是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目. 1. jwt认证流 ...
- 在asp.net webfrom 中完成用户自定义导出
asp.net原生控件实现自定义列导出功能 自定义列实现 最近负责开发公司内部使用的人事信息化系统时,有一个需求是这样的,需要在页面中可以用户每次导出Excel时自定义需要导出哪些列,经过半天的琢磨和 ...
- 【Java】IntelliJ IDEA 快捷键
IntelliJ IDEA 快捷键 1. Editing(编辑) 快捷键 介绍 Ctrl +Space 基本代码补全,输入字母按后列出匹配的词组 Ctrl+Shift+Space 智能代码补全,列出与 ...
- host解析
首先了解一下什么是hosts文件: hosts是一个没有扩展名的系统文件,可以用记事本等文本编辑工具打开,起作用就是将一些常用的"网址域名"与其对应的"IP地址" ...
- access偏移注入原理
前言:近段时间在学习access偏移注入时,在网上查询了大量的资料,感觉很多资料讲解的十分模糊并且我个人认为有很多不够严谨的地方,于是我便在线下经过大量测试,写出以下文章,如有错误,望指出. 如要转载 ...
- JUC之线程池基础与简单源码分析
线程池 定义和方法 线程池的工作时控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完成,再从队列中取出任 ...
- 微信小程序云开发指南
一.初识云开发 官方文档 小程序·云开发是微信团队联合腾讯云推出的专业的小程序开发服务. 开发者可以使用云开发快速开发小程序.小游戏.公众号网页等,并且原生打通微信开放能力. 开发者无需搭建服务器,可 ...
- Windows系统安装和office版本兼容
MSDN, I tell you 下载windows10系统各种纯净镜像.但是还是推荐使用官网修改参数显示出下载链接,下载windows10最新版. 在最近几次重做系统中,PE工具似乎无法识别从MSD ...
- 【摘抄】疑问chatterbot
ChatterBot使用哪种机器学习? -------------------------------------------------- - 简而言之,ChatterBot使用了许多不同的机器学 ...
- 使用Outlook欺骗性云附件进行网络钓鱼
滥用Microsoft365 Outlook 云附件的方式发送恶意文件,使恶意可执行云附件规避云查杀检测 介绍 在本文中,我们将探讨如何滥用 O365 上的云附件功能使可执行文件(或任何其他文件类型) ...