参考: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. [知乎]关于WindowsXPx64SP2系统的说明

    自己简单安装了下发现 winxpsp3x86的系统版本为: 然后windowsXPx64sp2的版本为:   作者:qpi667链接:https://www.zhihu.com/question/29 ...

  2. 使用navicat 链接数据库时乱码

    在建立数据库链接时设置  高级->编码->uft-8 其他版本使用下面方法

  3. 小程序开发 js里面array操作的方法列表。

  4. 用node编写cli工具

    cli是command-line interface的缩写,即命令行工具,常用的vue-cli, create-react-app, express-generator 等都是cli工具. 本文以自己 ...

  5. 深入理解javascript选择器API系列第三篇——HTML5新增的3种selector方法

    前面的话 尽管DOM作为API已经非常完善了,但是为了实现更多的功能,DOM仍然进行了扩展,其中一个重要的扩展就是对选择器API的扩展.人们对jQuery的称赞,很多是由于jQuery方便的元素选择器 ...

  6. 苹果ATS 豁免摆乌龙?

    现象 我们的App已经完成了NA部分的ATS适配.网页端由于有使用到第三方的页面,所以开启了网页的豁免权限.关于如何开启豁免及方法,可以参考喵神的Blog最终,我们的适配参数为: NSAllowsAr ...

  7. 前端开发【第6篇:JavaScript客户端(浏览器)】

    Web浏览器中的JavaScript 客户端JavaScript时间线 1.Web浏览器创建Document对象,并且开始解析web页面,解析HTML元素和它门的文本内容后添加Element对象和Te ...

  8. BZOJ2622 深入虎穴(最短路径)

    如果对某个点能求出与其相邻的所有点到达出口的最短时间,那么该点的答案就可以在其中取次小值了. 对于dijkstra魔改一下就能做到这个.初始时将所有出口的最短时间设为0并放入堆,记录最短和次短路径,每 ...

  9. 【题解】 bzoj1875: [SDOI2009]HH去散步 (动态规划+矩阵乘法)

    bzoj1875,懒得复制,戳我戳我 Solution: 看到这道题,看的出是个dp,每个点\(t\)时刻到达的方案数等于\(t-1\)到连过来的点方案数之和 但又因为题目有要求不能走一样的边回去不是 ...

  10. Java基本语法---个人参考资料

    Java语言基础组成:关键字.标识符.注释.常量和变量.运算符.语句.函数.数组 一.标识符 标识符是在程序中自定义的一些名称,由大小写字母[a-zA-Z],数字[0-9],下划线[ _ ],特殊字符 ...