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