关于特征检测,OpenCV提供了通用的接口FeatureDetector
类。简单调用其成员函数create()
和detect()
即可完成角点检测。
选取8个以角点为特征的特征检测器进行测试,包括:
- HARRIS
- GFTT (Shi-tomasi)
- SIFT
- SURF
- FAST
- STAR
- ORB (oriented BRIEF)
- BRISK
测试代码
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"
using namespace cv;
using namespace std;
int main()
{
string imgPath = "road.jpg";
Mat img = imread(imgPath, CV_LOAD_IMAGE_COLOR);
vector<string> detectorNames{"HARRIS","GFTT","SIFT",
"SURF","FAST","STAR","ORB","BRISK"};
cout << "DetectorName" << '\t'
<< "Number of corners" << '\t'
<< "Time used" <<'\t'<<"efficiency"
<< endl << endl;
for (string detectorName:detectorNames)
{
cout <<detectorName<<+"\t\t";
double t = (double)getTickCount();
//--detect keypoints
Ptr<FeatureDetector> detector
= FeatureDetector::create(detectorName);
vector<KeyPoint> keyPoints;
detector->detect(img, keyPoints, Mat());
cout << keyPoints.size() << "\t\t\t";
//--draw keypoints
Mat imgKeyPoints;
drawKeypoints(img, keyPoints, imgKeyPoints,
Scalar::all(-1), DrawMatchesFlags::DEFAULT);
imshow(detectorName+" KeyPoints", imgKeyPoints);
//time used
t = ((double)getTickCount() - t) / getTickFrequency();
cout << t << "\t";
//Number of coners detected per unit time(ms)
double efficiency = keyPoints.size() / t / 1000;
cout << efficiency << endl<<endl;
}
waitKey(0);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
运行结果
HARRIS
GFTT
SIFT
SURF
FAST
STAR
ORB
BRISK
比较
可以看出,FAST特征检测算法的检测速度是超群的,难怪敢自称“FAST”。从特征点检测效率以及检测出的特征点数来看,SURF表现也不错。以上各个角点检测器,使用的都是OpenCV默认的封装,可能会因为具体的参数设置差异,检测出的角点数有不同,可比性没法说明。但是,特征点检测效率还是很客观的。由以上结果得知,检测效率最高的前3个检测器分别为FAST,ORB,SURF。