参考:http://www.cnblogs.com/ronny/p/4045979.html,博主对源码进行了分析,不过很多没看明白。

分为几个部分。积分图:借助积分图像,图像与高斯二阶微分模板的滤波转化为对积分图像的加减运算。在哈尔特征中也用到这个。

DoH近似:将模板与图产像的卷积转换为盒子滤波运算,我们需要对高斯二阶微分模板进行简化,进而对Hessian矩阵行列式的值进行简化。使用近似的Hessian矩阵行列式的极大值检测斑点,

使用近似的Hessian矩阵行列式来表示图像中某一点x处的斑点响应值,遍历图像中所有的像元点, 便形成了在某一尺度下琉璃点检测的响应图像。

使用不同的模板尺寸,便形成了多尺度斑点响应的金字塔图像,利用这一金字塔图像,就可以进行斑点响应极值点的搜  索,其过程完全与SIFT算法类同。

尺度空间表示:通常想要获取不同尺度的斑点,必须建立图像的尺度空间金字塔。由于采用了盒子滤波和积分图像,并不需要像SIFT算法那样去直接建立图像金字塔,

而是采用不断增大盒子滤波模板的尺寸的间接方法。

兴趣点的定位:为了在图像及不同尺寸中定位兴趣点,我们用了3×3×3邻域非最大值抑制。

这篇博文说得很详细:http://www.cnblogs.com/wangguchangqing/p/4333873.html

关于BFMatcher和FlannBasedMatcher,可参考:http://m.blog.csdn.net/blog/u012564690/40926315

#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"//因为在属性中已经配置了opencv等目录,所以把其当成了本地目录一样
#include <opencv2/nonfree/features2d.hpp>
#include "opencv2/highgui/highgui.hpp"
#include<opencv2/legacy/legacy.hpp>
/*这里用的是图像对图像集,注意FLANN的用法*/
using namespace cv;
using namespace std; int main()
{
Mat trainImage = imread("1.jpg"), trainImage_gray;
cvtColor(trainImage, trainImage_gray, CV_BGR2GRAY); vector<KeyPoint> train_keypoint;
Mat trainDescriptor;
SurfFeatureDetector featureDector(80);//80是什么?
featureDector.detect(trainImage_gray, train_keypoint);
SurfDescriptorExtractor featureExtractor; featureExtractor.compute(trainImage_gray, train_keypoint, trainDescriptor); //创建基于FLANN的描述符匹配对象
FlannBasedMatcher matcher;
vector<Mat> train_desc_collection(1, trainDescriptor);//两个参数是什么
matcher.add(train_desc_collection);//这两句什么意思
matcher.train(); VideoCapture cap("test.avi");
unsigned int frameCount = 0; while (char(waitKey(1)) != 'q')
{
int64 time0 = getTickCount();
Mat testImage, testIMage_gray;
cap >> testImage;
if (testImage.empty())
continue;
cvtColor(testImage, testIMage_gray, CV_BGR2GRAY); vector<KeyPoint> test_keyPoint;
Mat testDescriptor;
featureDector.detect(testIMage_gray, test_keyPoint);
featureExtractor.compute(testIMage_gray, test_keyPoint, testDescriptor); vector<vector<DMatch>> matches;
matcher.knnMatch(testDescriptor, matches, 2);//对每个匹配,返回两个最近邻匹配 vector<DMatch> goodMatches;
for (int i = 0; i < matches.size(); i++)
{
if (matches[i][0].distance < 0.6*matches[i][1].distance)//第一个匹配与第二个匹配距离
//足够小时,才认为这是一个好的匹配
goodMatches.push_back(matches[i][0]);
} Mat dstImage;
drawMatches(testImage, test_keyPoint, trainImage, train_keypoint, goodMatches, dstImage);
imshow("匹配窗口", dstImage); cout << cvGetTickFrequency() / (getTickCount() - time0) << endl;
} waitKey(0);
return 0;
}

  

SURF 特征匹配的更多相关文章

  1. OpenCV-Python sift/surf特征匹配与显示

    import cv2 import numpy as np def drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch): h1, w1 ...

  2. 【OpenCV新手教程之十八】OpenCV仿射变换 &amp; SURF特征点描写叙述合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)  ...

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

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

  4. OpenCV2简单的特征匹配

    特征的匹配大致可以分为3个步骤: 特征的提取 计算特征向量 特征匹配 对于3个步骤,在OpenCV2中都进行了封装.所有的特征提取方法都实现FeatureDetector接口,DescriptorEx ...

  5. 基于SURF特征的目标检测

    转战matlab了.步骤说一下: 目标图obj 含目标的场景图scene 载入图像 分别检测SURF特征点 分别提取SURF描述子,即特征向量 用两个特征相互匹配 利用匹配结果计算两者之间的trans ...

  6. 基于SURF特征的图像与视频拼接技术的研究和实现(一)

    基于SURF特征的图像与视频拼接技术的研究和实现(一)      一直有计划研究实时图像拼接,但是直到最近拜读西电2013年张亚娟的<基于SURF特征的图像与视频拼接技术的研究和实现>,条 ...

  7. SURF特征

    了解了SIFT特征后,来学习SURF特征. 虽说是SIFT的一个变种,可是跟SIFT还是有差别的 差别有例如以下: 1.尺度空间的构建(近似)不同. 2.同意尺度空间多层图像同一时候被处理 3.特征点 ...

  8. 特征提取(Detect)、特征描述(Descriptor)、特征匹配(Match)的通俗解释

    特征匹配(Feature Match)是计算机视觉中很多应用的基础,比如说图像配准,摄像机跟踪,三维重建,物体识别,人脸识别,所以花一些时间去深入理解这个概念是不为过的.本文希望通过一种通俗易懂的方式 ...

  9. OpenCV探索之路(二十三):特征检测和特征匹配方法汇总

    一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点.计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要. ...

随机推荐

  1. Oracle 数据库执行 操作系统的命令

    1 Linux环境下面的处理 在sqlplus 里面 添加一个 ! 就可以执行 但是 因为Oracle 必须为非root用户 所以很多命令可能无法执行: 2. Windows 环境执行命令的方式 是在 ...

  2. HTTTP及TCP的超时以及KEEP-ALIVE机制小结

    一.HTTP的超时和Keep Alive HTTP Keepalive 机制是http 1.1中增加的一个功能. 在HTTP 1.0中,客户端每发起一个http 请求,等收到接收方的应答之后就断开TC ...

  3. 2017-12 CDQZ集训(已完结)

    从联赛活了下来(虽然分数倒一……),接下来要去CDQZ集训啦…… DAY -2 2017-12-16 被老师安排负责一部分同学的住宿以及安排…… 抓紧时间继续学习,LCT真好玩啊真好玩…… 晚上放假了 ...

  4. 【题解】 bzoj2115: [Wc2011] Xor (线性基+dfs)

    bzoj2115,戳我戳我 Solution: 看得题解(逃,我太菜了,想不出这种做法 那么丢个链接 Attention: 板子别写错了 又写错了这次 \(long long\)是左移63位,多了会溢 ...

  5. oracle存储过程批量插入测试数据

    前几天测试中债时,自定义资产有一级类型和二级类型,一级类型下有很多分类,每个分类下又有很多二级分类,而要做的是每种类型都要建立一个自定义资产,并做一笔交易,然后测试是否出值,于是写了一个存储过程批量插 ...

  6. 【bzoj1040】 ZJOI2008—骑士

    http://www.lydsy.com/JudgeOnline/problem.php?id=1040 (题目链接) 题意 一个基环森林,从中选出不相邻的若干个点使得这些点的点权和最大. Solut ...

  7. idea问题总结记录

    1.部署tomcat后,tomcat日志报错:java.lang.ClassNotFoundException 1.1 原因: tomcat虽然部署成功,但是并没有把本项目中访问服务器所需的类库加到W ...

  8. Logistic回归中损失函数求导证明过程

  9. AngularJS 项目里使用echarts 2.0 实现地图功能

    项目中有一页是显示全国地图, echarts官网的地图实例里,有一个模拟迁徙的实例,比较符合项目需求.所以大部分配置项是参考此实例. angular 就不过多介绍了, Google出品的mvc(或者说 ...

  10. SQL语句(十四)子查询

    --1. 使用IN关键字 --例1 查询系别人数不足5人的系别中学生的学号.姓名和系别 --系别人数不足5人的系别 ==>选择条件 select Sdept from Student Group ...