第一次写文章,欢迎各位多多指教呀!!
最近做双目提取特征点,比较各个提取特征点算法性能,特将几种方法汇总了一下,包括(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; }