在OpenCV里使用SURF

目标:学习SURF基本知识

 

理论:

在前面学习过SIFT,明白了关键点检测和描述,但是SIFT的计算量比较大,并且运行有点慢,因此人们开始思考能否进行改善,让速度更快一些。在2006年,Bay,H.,Tuytelaars,T. 和 Van Gool,L发表论文《SURF: Speeded Up Robust Features》,在这里引用一个新的算法,叫做SURF,它是一种加速版本的SIFT。

在SIFT里,采用DoG来替换LoG实现一些加速,而在SURF里使用窗口平滑来替换LoG,下图就是用来说明窗口平滑怎么样起作用:

上图左边是高斯二阶微分结果,右边是采用窗口平滑Box Filter近似。使用这个滤波之后,有一个大优势:可以采用积分图像来替换卷积运算,并且可以平行处理不同尺度空间里的图片,而在SIFT里每一层图像依赖上一层图像,不能进行并行处理。并且SURF计算关键点的尺度和位置也只是依赖与 Hessian 矩阵行列式。

在方向分配方面,为了保证旋转不变性,首先以特征点为中心,计算半径为6s(S为特征点所在的尺度值)的邻域内的点在z、y方向的Haar小波(Haar小波边

调用摄像头做surf特征点识别

05-10

程序如下,编译成功,运行了就中断。把这段程序移植到其他程序后,还是一样的问题,前两张图片可以,第三张图片就中断了为什么。。。。。。? 大神们,帮帮忙,谢谢~ #include "stdafx.h" #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/nonfree/features2d.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace cv; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { VideoCapture cap(0); if (!cap.isOpened()) { cout<<"cap open failed!!!"; return -1; } cout<<"cap open success"<<endl; Mat img_1 = imread( "d:/3.jpg", CV_LOAD_IMAGE_GRAYSCALE ); //Mat img_2 = imread( "d:/4.jpg", CV_LOAD_IMAGE_GRAYSCALE ); Mat img_22; Mat img_2; for (;;) { cap >> img_22; cvtColor(img_22,img_2,CV_BGR2GRAY); if( !img_1.data || !img_2.data ) { return -1; } //-- Step 1: Detect the keypoints using SURF Detector //Threshold for hessian keypoint detector used in SURF int minHessian = 1500; 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 BFMatcher matcher(NORM_L2,false); //FlannBasedMatcher matcher1; vector< DMatch > matches; vector<vector< DMatch >> matches2; matcher.match( descriptors_1, descriptors_2, matches ); //matcher1.match(descriptors_1, descriptors_2, matches ); const float minRatio = 1.f / 1.5f; matches.clear(); matcher.knnMatch(descriptors_1, descriptors_2,matches2,2); for (size_t i=0; i<matches2.size(); i++) { const cv:Match& bestMatch = matches2[i][0]; const cv:Match& betterMatch = matches2[i][1]; float distanceRatio = bestMatch.distance /betterMatch.distance; // Pass only matches where distance ratio between // nearest matches is greater than 1.5 // (distinct criteria) if (distanceRatio < minRatio) { matches.push_back(bestMatch); } } //-- Draw matches Mat img_matches; drawMatches( img_1, keypoints_1, img_2, keypoints_2, matches, img_matches ); //-- Show detected matches imshow("Matches", img_matches ); if(waitKey(30)>=0) break; } return 0; } ![图片说明](https://img-ask.csdn.net/upload/201505/10/1431221025_224993.png) 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览

应支付9.90元
点击重新获取
扫码支付

支付成功即可阅读