提取图像特征点 小汇总,opcv2.3.1

第一次写文章,欢迎各位多多指教呀!!

最近做双目提取特征点,比较各个提取特征点算法性能,特将几种方法汇总了一下,包括(mser、harris 、sift、surf、star,fast),可以方便的将特征点个数和提取时间作对比

利用drawKeypoints(gray,keypoints,src,Scalar(0,0,255),DrawMatchesFlags::DRAW_OVER_OUTIMG);在源图像中画出特征点,DrawMatchesFlags可以选择四种方式画出特征点:DrawMatchesFlags
{
    enum{ DEFAULT = 0, 

          DRAW_OVER_OUTIMG = 1,          

    NOT_DRAW_SINGLE_POINTS = 2, 

          DRAW_RICH_KEYPOINTS = 4  

};

DRAW_RICH_KEYPOINTS画出了特征点的支持区域以及主方向,代码如下,供大家参考!

作者:apache11  出处:http://www.cnblogs.com/apache11 欢迎转载,也请保留这段声明。谢谢!
#include "opencv2\opencv.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

void help()
{
	cout<<"Extract corners from an image"<<endl;
}

int main(int argc, char** argv)
{
	Mat src,gray;
	help();
	const char* srcname = argc==2?argv[1]:"hmbb.jpg";
	src = imread(srcname,1);

	if ( !src.data )
	{
		cout<<"The image is not loaded! "<<endl;
		return -1;
	}

	namedWindow("src image",1);
	imshow("src image",src);
	cout<<"Press any to continue..."<<endl<<endl;
	cvtColor(src,gray,CV_BGR2GRAY);

	cout<<"Please choose the mothod of extracting keypoints:"<<endl;
	cout<<"    "<<"h--Harris"<<endl
		<<"    "<<"f--FAST"  <<endl
		<<"    "<<"u--SURF"  <<endl
		<<"    "<<"s--SIFT"  <<endl
		<<"    "<<"m--MSER"  <<endl
		<<"    "<<"a--STAR"  <<endl;
	cout<<"Input your choice..."<<endl;

	char c=waitKey(0);

	double tt = (double)cvGetTickCount();

	if (c == 27)
	{
		return 0;
	}
	switch(c)
	{
	case 'h':
		//extract harris keypoints
		{
			Mat corners;
			cornerHarris(gray,corners,3,3,0.01);
			double thres = 0.001;
			threshold(corners,corners,thres,255,THRESH_BINARY_INV);
			namedWindow("harris keypoints image",1);
			imshow("harris keypoints image",corners);
			break;
		}

	case 'f':
		//extract FAST keypoints
		{
			vector <KeyPoint> keypoints;
			FastFeatureDetector fast(40);
			fast.detect(gray,keypoints);

			drawKeypoints(gray,keypoints,src,Scalar(0,0,255),DrawMatchesFlags::DRAW_OVER_OUTIMG);

			namedWindow("FAST keypoints image",1);
			imshow("FAST keypoints image",src);
			break;
		}
	case 'u':
		//extract SURF keypoints
		{
			vector <KeyPoint> keypoints;
			SurfFeatureDetector surf(2500.);
			surf.detect(gray,keypoints);
			drawKeypoints(src,keypoints,src,Scalar(0,0,255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
			namedWindow("SURF keypoints image",1);
			imshow("SURF keypoints image",src);
			break;
		}
	case 's':
		//extract SIFT keypoints
		{
			vector <KeyPoint> keypoints;
			SiftFeatureDetector sift(0.03 , 10.);
			sift.detect(gray ,keypoints);
			drawKeypoints(src,keypoints,src,Scalar(0,0,255),DrawMatchesFlags::DEFAULT);
			namedWindow("SIFT keypoints image",1);
			imshow("SIFT keypoints image",src);
			break;
		}
	case 'm':
		//extract MSER keypoints
		{
			vector <KeyPoint> keypoints;
			CvMSERParams params=cvMSERParams();
			MserFeatureDetector mser(params);
			mser.detect(gray,keypoints);
			drawKeypoints(src,keypoints,src,Scalar(0,0,255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
			namedWindow("MSER keypoints image",1);
			imshow("MSER keypoints image",src);
			break;
		}
	case 'a':
		//extract Star keypoints
		{
			vector <KeyPoint> keypoints;
			const CvStarDetectorParams& params=cvStarDetectorParams();
			StarFeatureDetector star(params);
			star.detect(gray , keypoints);
			drawKeypoints(src,keypoints,src,Scalar(0,0,255),DrawMatchesFlags::DRAW_OVER_OUTIMG);
			namedWindow("Star keypoints image",1);
			imshow("Star keypoints image",src);
			break;
		}
	default:
			cout<<"error!!!"<<endl;
	}
	
	tt = (double)cvGetTickCount() - tt;

	cout<<"Extraction time = "<<tt/(cvGetTickFrequency()*1000.)<<"ms"<<endl;
	
	while ( 1 )
	{		
			if ( waitKey(100)==27)
				break;
	}
	
	destroyAllWindows();
	return 1;

}

 

 

posted @ 2012-11-28 21:47  apache11  阅读(1491)  评论(0编辑  收藏  举报