zoukankan      html  css  js  c++  java
  • 提取图像特征点 小汇总,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;
    
    }
    
  • 相关阅读:
    day2--操作系统
    day1--计算机基础1
    内置模块subprocess
    正则表达式和内置模块re
    内置模块(二)
    python内置模块 (一)
    lambda
    递归函数
    关于内置函数
    面向过程的编程
  • 原文地址:https://www.cnblogs.com/apache11/p/2793453.html
Copyright © 2011-2022 走看看