Fast特征检测,特点是速度很快,只需要对比几个像素,就可以判断是否为关键点。
OpenCV提供的调用接口也很方便
vector<KeyPoint> keypoints;
int threshold = 100;
Ptr<FeatureDetector> fastDetector = FastFeatureDetector::create(threshold);
fastDetector->detect(image,keypoints);
可以看下OpenCV提供的FastFeatureDetector::create的原型:
CV_WRAP
static
Ptr
<
FastFeatureDetector
> create(
int
threshold
=10,
bool
nonmaxSuppression
=
true
,
FastFeatureDetector
::
DetectorType
type
=
FastFeatureDetector
::
TYPE_9_16
)
Fast特征检测的原理很简单,但是经过了一系列的演化,为了描述清楚,我从最原始的思路开始说起。
以图像上任意一点为圆心,做一个圆,如果圆弧上有连续3/4个点的灰度值,明显大于或者小于中心点灰度值(阈值控制),则认为中心点为特征点。如果我们取圆弧上的四个特殊点,分别为垂直方向的上下两个点和水平方向的左右两个点,如果要满足上面的条件,必须满足中心点大于或者小于这四个点中的连续三个点,否则肯定不是角点,根据这一特点,可以排除大量的点,从而大大减少计算量。
例如下图,0为中心点,其它标数字的都是圆弧上的点,1,9,13,5是圆弧上的四个特殊点。圆弧上总的点数是16,3/4的点个数应该为12,但是最后根据经验,把连续线段长度减少为9,可以使对图像的角点检测有更好的重复性。其实对于其它半径,最后检测的连续线段都做了简化,不再是最初定义的3/4。
根据上面所述,圆的半径应该是一个参数,其实这个参数再
create方法的第三个参数做了体现。
create方法第三个参数默认为
FastFeatureDetector
::
TYPE_9_16,什么意思呢?16是圆弧上的总点数,9为实际检测的连续点的个数这个对应半径为3的情况。
如下是OpenCV对DetectorType定义
enum
DetectorType
{
TYPE_5_8 = 0,
TYPE_7_12 = 1,
TYPE_9_16 = 2
};
TYPE5_5_8 对应半径为1的情况,TYPE_7_12对应半径为2的情况。
int fast_threshold = 50;
const int max_threshold = 300;
Mat img_object;
/** @function main */
void fast_feature_detector(int,void*)
{
vector<KeyPoint> keypoints;
Ptr<FeatureDetector> fastDetector = FastFeatureDetector::create(fast_threshold);
fastDetector->detect(img_object, keypoints);
Mat img_keypoints;
drawKeypoints(img_object, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
cv::imshow("image keypoints", img_keypoints);
}
int main(int argc, char** argv)
{
img_object = imread("./box.png", CV_LOAD_IMAGE_GRAYSCALE);
namedWindow("image keypoints");
createTrackbar("Threshold","image keypoints",&fast_threshold, max_threshold, fast_feature_detector);
fast_feature_detector(0, 0);
waitKey(0);
}
threshold越大特征点越少,反之,特征点越多,如果threshold大于255,取threshold的后8bits。
使用fast特征检测,threshold参数很关键,但是实际情况中不太容易确定,而且这个threshold是一个全局值,没有提供局部阈值的接口。fastDetector效果一般,不太建议使用。
OpenCV还提供了一些附加工具,适配特征点检测,这里不再赘述,参考DynamicAdaptedFeatureDetector,GridAdaptedFeatureDetector,:PyramidAdaptedFeatureDetector等的内容。
参考:
《OpenCV计算机视觉编程攻略(第2版)》 [加] Robert 著 相银初 译