学习OpenCV——Surf简化版
之前写过一遍关于学习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 );
PS:OpenCV 你是在太强悍了!!!只有我想不到,木有你办不到的啊! 我真心跪了!
- /**
- * @file SURF_descriptor
- * @brief SURF detector + descritpor + BruteForce Matcher + drawing matches with OpenCV functions
- * @author A. Huaman
- */
- #include <stdio.h>
- #include <iostream>
- #include "opencv2/core/core.hpp"
- #include "opencv2/features2d/features2d.hpp"
- #include "opencv2/highgui/highgui.hpp"
- using namespace cv;
- using namespace std;
- void readme();
- /**
- * @function main
- * @brief Main function
- */
- int main( int argc, char** argv )
- {
- //if( argc != 3 )
- //{ return -1; }
- Mat img_1 = imread( "D:/src.jpg", CV_LOAD_IMAGE_GRAYSCALE );
- Mat img_2 = imread( "D:/Demo.jpg", CV_LOAD_IMAGE_GRAYSCALE );
- if( !img_1.data || !img_2.data )
- { return -1; }
- //-- Step 1: Detect the keypoints using SURF Detector
- int minHessian = 400;
- double t=getTickCount();
- SurfFeatureDetector detector( minHessian );
- std::vector<KeyPoint> keypoints_1, keypoints_2;
- detector.detect( img_1, keypoints_1 );
- detector.detect( img_2, keypoints_2 );
- //-- Step 2: Calculate descriptors (feature vectors)
- SurfDescriptorExtractor extractor;
- Mat descriptors_1, descriptors_2;
- extractor.compute( img_1, keypoints_1, descriptors_1 );
- extractor.compute( img_2, keypoints_2, descriptors_2 );
- //-- Step 3: Matching descriptor vectors with a brute force matcher
- BruteForceMatcher< L2<float> > matcher;
- std::vector< DMatch > matches;
- matcher.match( descriptors_1, descriptors_2, matches );
- t=getTickCount()-t;
- t=t*1000/getTickFrequency();
- //-- Draw matches
- Mat img_matches;
- drawMatches( img_1, keypoints_1, img_2, keypoints_2, matches, img_matches );
- cout<<"Cost Time:"<<t<<endl;
- //-- Show detected matches
- imshow("Matches", img_matches );
- waitKey(0);
- return 0;
- }
- /**
- * @function readme
- */
- void readme()
- { std::cout << " Usage: ./SURF_descriptor <img1> <img2>" << std::endl; }
图像中match的keypoints没有经过过滤。导致匹配点过多
文档中还有一个版本带定位的和过滤Match的,
from: http://blog.csdn.net/yangtrees/article/details/7544133
学习OpenCV——Surf简化版的更多相关文章
- 学习OpenCV——ORB简化版&Location加速版
根据前面surf简化版的结构,重新把ORB检测的代码给简化以下,发现虽然速度一样,确实能省好多行代码,关键是有 BruteForceMatcher<HammingLUT>matcher的帮 ...
- 学习OpenCV——Surf(特征点篇)&flann
Surf(Speed Up Robust Feature) Surf算法的原理 ...
- 特征点检测学习_2(surf算法)
依旧转载自作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 特征点检测学习_2(surf算法) 在上篇博客特征点检测学习_1(sift算法) 中 ...
- 学习opencv之路(一)
先看一下<学习opencv> 找几个demo 学会相机标定 我做的是单目相机的标定.
- [纯小白学习OpenCV系列]官方例程00:世界观与方法论
2015-11-11 ----------------------------------------------------------------------------------- 其实,写博 ...
- 《学习OpenCV》中求给定点位置公式
假设有10个三维的点,使用数组存放它们有四种常见的形式: ①一个二维数组,数组的类型是CV32FC1,有n行,3列(n×3) ②类似①,也可以用一个3行n列(3×n)的二维数组 ③④用一个n行1列(n ...
- 对人脑处理视觉的描述(摘《学习OpenCV(中文版)》)
人脑将视觉信号划分入很多个通道,将各种不同的信息输入你的大脑.你的大脑有一个关注系统,会根据任务识别出图像的重要部分,并做重点分析,而其他部分则分析得较少 .在人类视觉流中存在大量的反馈,但是目前我们 ...
- 《学习OpenCV》练习题第五章第二题abc
代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...
- 《学习OpenCV》练习题第五章第一题ab
这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...
随机推荐
- 【BZOJ】3916: [Baltic2014]friends
http://www.lydsy.com/JudgeOnline/problem.php?id=3916 #include <bits/stdc++.h> using namespace ...
- UVA 11039 - Building designing(DP)
题目链接 本质上是DP,但是俩变量就搞定了. #include <cstdio> #include <cstring> #include <algorithm> u ...
- Cento 安装配置FastFDS
unzip -x libfastcommon-master.zip ./make.sh ./make.sh install /usr/include/fastcommon cd FastDFS ./m ...
- NodeJS学习笔记之Connect中间件模块(一)
NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...
- Java基础:继承,封装,多态,抽象类,接口
只要是从事Java语言有关的开发工作,在面试中难念会被问到这几个东西. 博主学习java有两年多了,算是浅显的知道一些,抄写了一些解释分享一下. 1.什么是面向对象?(面对女朋友) 面向对象(Obje ...
- 已知树的前序、中序,求后序的c++实现&已知树的后序、中序,求前序的c++实现
#include"iostream" using namespace std; int pre[30]; int in[30]; int post[30]; int indexOf ...
- Odoo 配置快速创建编辑按钮
对于Man2one类型的数据,我们知道,form view中总会显示出一个尾巴似的"create and edit"和一个快速创建的机制,有时候业务人员一不小心就容易创建一个新的行 ...
- List集合对象根据字段排序
//把需要比较的对象实现Comparable接口实现compareTo方法 public class Address implements Comparable<Address> { St ...
- scala case class
在我们详细介绍Scala的Case class和模式匹配之前,我们可以通过一个简单的例子来说明一些基本概念.我们设计一个函数库,这个函数库可以用来计算算术表达式,为简单起见,我们设计的算术表达式只侧重 ...
- c# 复习
一.输入输出语句 二.异常语句 try catch fina 保护程序,在出错的情况下也不会终止. 三.输入一个日期,判断是否正确. 每日一语:觉得自己做得到和做不到,其实只在一念之间.