FAST (Features from Accelerated Segment Test) 算法用来实时提取角点特征,
详细原理见paper:“Machine learning for high-speed corner detection” in 2006 (Later revised it in 2010).
先说下FAST特征的原理吧。
在图像中选择一点p,它的像素值为Ip
然后把Ip和它周围16个点的像素值作比较,取阈值t,
如果这16个点中连续n个点的像素值都 > Ip + t, 或者 < Ip - t, 就认为p是角点;n 取12。
一种更快的方法,就是coarse to fine思想,
先取图中的1,9,5,13点,先比较点1和9,都满足像素值 > Ip + t, 或者 < Ip - t时,再比较5和13。
至少3个点满足,认为p是可能是角点,如果这4个点一个都不满足,则直接认为p不是,排除掉。
当满足至少3个以后,再check一圈的16个点。
FAST算法存在几个缺点:
n < 12时会检测出很多点(不会排除太多的候选点)。
选出的点可能不是最优的,
上面提到的快速方法会抛弃一些点,
可能一片小区域附近会出现很多相邻的特征点。
上面前3个缺点可用Machine Learning解决(具体就不写了),最后一个用NMS解决,
NMS解决方法:
计算点p与它一圈16个点像素值之差的绝对值的和V
比如两个相邻的特征点,计算它们的V,抛弃V较小的那个点。
FAST算法的特点:
实时性,
对噪声不robust, 依赖于阈值t
下面看Opencv中的函数FAST
void FAST(InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression=true)