OpenCV图像匹配算法之surf

utils.h与utils.cpp

//surf.cpp
#include "stdafx.h"
#include <cv.hpp>
#include <highgui.h>
#include "utils.h"
#include <iostream>
using namespace std;

void surf(char* path1, char* path2, INFO& info, bool show)
{
	double t1,t2;
	t1=cvGetTickCount();

	initModule_nonfree();

	Mat img1, img2;
	img1=imread(path1,0);
	img2=imread(path2,0);
	if(img1.data==NULL)
	{
		cout<<"The image can not been loaded: "<<path1<<endl;
		system("pause");
		exit(-1);
	}
	if(img2.data==NULL)
	{
		cout<<"The image can not been loaded: "<<path2<<endl;
		system("pause");
		exit(-1);
	}

	int minHessian=200;
	SurfFeatureDetector surf_detector(minHessian) ;
	SurfDescriptorExtractor surf_descriptor ;
	vector<KeyPoint> kpts1_surf, kpts2_surf;
	Mat desc1_surf, desc2_surf;
	Ptr<cv::DescriptorMatcher> matcher_l2 = DescriptorMatcher::create("BruteForce");			//欧氏距离匹配
	vector<vector<DMatch> > dmatches_surf;
 	vector<Point2f> matches_surf, inliers_surf;

	surf_detector.detect(img1,kpts1_surf);
	surf_detector.detect(img2,kpts2_surf);
	info.n1 = kpts1_surf.size();
	info.n2 = kpts2_surf.size();

    surf_descriptor.compute(img1,kpts1_surf,desc1_surf);
    surf_descriptor.compute(img2,kpts2_surf,desc2_surf);
	matcher_l2->knnMatch(desc1_surf,desc2_surf,dmatches_surf,2);
    matches2points_nndr(kpts1_surf,kpts2_surf,dmatches_surf,matches_surf,DRATIO);
	info.m=matches_surf.size()/2;
    compute_inliers_ransac(matches_surf,inliers_surf,MIN_H_ERROR,false);
	info.rm=inliers_surf.size()/2;

    t2=cvGetTickCount();
	info.t=(t2-t1)/1000000.0/cvGetTickFrequency();

    Mat img1_rgb_surf = imread(path1,1);
	Mat img2_rgb_surf = imread(path2,1);
	Mat img_com_surf = Mat(Size(img1.cols*2,img1.rows),CV_8UC3);

	if(show == true)
	{
		draw_inliers(img1_rgb_surf,img2_rgb_surf,img_com_surf,inliers_surf,2);
		imshow("surf",img_com_surf);
		waitKey(0);
	}

	return;
}

使用

INFO surf_info;
surf(path1,path2,surf_info,false);
showInfo(surf_info);
时间: 2024-10-06 09:42:51

OpenCV图像匹配算法之surf的相关文章

OpenCV图像匹配算法之sift

//utils.h #ifndef _UTILS_H #define _UTILS_H #include <opencv2/opencv.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2\nonfree\nonfree.hpp

OpenCV图像匹配算法之orb

utils.cpp与utils.h //orb.cpp #include "stdafx.h" #include <cv.hpp> #include <highgui.h> #include "utils.h" #include <iostream> using namespace std; void orb(char* path1, char* path2, INFO& info, bool show) { double

OpenCV图像匹配算法之brisk

utils.cpp与utils.h //brisk.cpp #include "stdafx.h" #include <cv.hpp> #include <highgui.h> #include "utils.h" #include <iostream> using namespace std; void brisk(char* path1, char* path2, INFO& info, bool show) { do

OpenCV图像匹配算法之freak

utils.cpp与utils.h //freak.cpp #include "stdafx.h" #include <cv.hpp> #include <highgui.h> #include "utils.h" #include <iostream> using namespace std; void freak(char* path1, char* path2, INFO& info, bool show) { do

OpenCV图像Surf与flann特征点(转载)

Surf(Speed Up Robust Feature) Surf算法的原理                                                                            1.构建Hessian矩阵构造高斯金字塔尺度空间 其实surf构造的金字塔图像与sift有很大不同,就是因为这些不同才加快了其检测的速度.Sift采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像.Hessian矩阵是Surf算法的核心,为了方便运

OpenCV特征点检测------Surf(特征点篇)

Surf(Speed Up Robust Feature) Surf算法的原理                                                                           1.构建Hessian矩阵构造高斯金字塔尺度空间 其实surf构造的金字塔图像与sift有很大不同,就是因为这些不同才加快了其检测的速度.Sift采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像.Hessian矩阵是Surf算法的核心,为了方便运算

opencv图像原地(不开辟新空间)顺时旋转90度

前一阵朋友碰到这么一道题:将图像原地顺时针旋转90度,不开辟新空间.此题看似平易(题目简短),仔细研究发现着实不容易.经过一番探索后,终于找到了正确的算法,但是当使用opencv实现时,有碰到了困难而且费了一番周折才找到问题所在. 首先,解决这个问题,先简化成原地90度旋转一M×N的矩阵A(注意不是N×N方阵).对于2×3的矩阵A = {1,2,3;4,5,6},其目标为矩阵B = {4,1;5,2;6,3}.因为是原地旋转,这里A和B应指向同一大小为6的内存空间. 这里有这样一个重要的导出公式

OpenCV &mdash;&mdash; 图像局部与部分分割(一)

背景减除 一旦背景模型建立,将背景模型和当前的图像进行比较,然后减去这些已知的背景信息,则剩下的目标物大致就是所求的前景目标了 缺点 -- 该方法基于一个不长成立的假设:所有像素点是独立的 场景建模 新的前景(物体移动的新位置) -- 旧的前景 (物体离开后留下的"空洞")-- 背景 cvInitLineIterator()  和  CV_NEXT_LINE_POINT() 对任意直线上的像素进行采样 // 从视频的一行中读出所有像素的RGB值,收集这些数值并将其分成三个文件 #inc

OpenCV &mdash;&mdash; 图像局部与分割(二)

分水岭算法 将图像中的边缘转化成"山脉",将均匀区域转化为"山谷" 分水岭算法首先计算灰度图像的梯度,这对山谷或没有纹理的盆地(亮度值低的点)的形成有效,也对山头或图像中没有主导线段的山脉(山脊对应的边缘)的形成有效.然后开始从用户指定点或算法得到的点开始"灌注"盆地知道这些区域连在一起.基于这样产生的标记就可以把区域合并到一起,合并后的区域又通过聚集的方式进行分割,好像图像被"填充"起来. cvWatershed 用 Inp