FAST特征点检测
1. FAST简介
其基本思想是比较当前点与周边点差异,当周边有连续N个点均比中间点亮或者暗,则认为该点为一个FAST特征点。FAST 算法研究的出发点是开发一种可用于实时帧率应用(如移动机器人上的 SLAM)的兴趣点检测器,而这些应用的计算资源有限。
2. FAST算法步骤

- 在图像中选择一个像素p,假设该像素的强度为 IP。
- 设置一个阈值强度 T(例如为被测试像素强度的 20%)。
- 考虑围绕像素 p 的 16 个像素组成的圆。
- 如果检测该像素为兴趣点,则16个像素中需要有N个连续像素的强度要么高于 IP+T,要么低于 IP-T。(作者在算法的第一个版本中使用 N = 12)
- 为了加快算法,首先将圆上的第 1、5、9 和 13 个像素的强度与 IP 进行比较。这四个像素中至少有三个应满足阈值条件,p才可能为兴趣点。
- 如果四个像素值 1、5、9、13 中至少有三个未满足高于或低于 IP±T 的条件,则 p 不是兴趣点(角点)。在这种情况下,直接将像素 p 排除。否则,如果至少有三个像素的值高于或低于 IP ± T,则检查所有16个像素,判断是否有12个连续像素符合该标准。
- 对图像中的所有像素重复这一过程。
3. 算法后处理
3.1 非极大值抑制
在初始版本的算法中,检测到彼此相邻的多个兴趣点是另一个问题。这可以通过在检测兴趣点后应用非极大值抑制来解决。
- 对每个检测到的点计算得分函数V。得分函数定义为:连续弧线上的像素与中心像素的绝对差值之和。
- 考虑两个相邻的兴趣点(可以是MM的邻域:33 / 5*5),比较它们的V值。
- 舍弃V值较低的那个。得分函数也可以用其他方式定义。关键点是定义一个启发式函数,用于比较两个相邻检测到的角点并消除相对不重要的那一个。
周围16个像素的灰度值与中心点的差异越大,越能表明该位置具有更好的不变性
3.2 特征点均匀分布处理
有一种常用的处理方法,就是把图像分割成网格状,对每个小图像进行单独检测。OpenVins中的FAST特征提取代码:
static void perform_griding(const cv::Mat &img, const cv::Mat &mask,
std::vector<cv::KeyPoint> &pts, int num_features, int grid_x,
int grid_y, int threshold, bool nonmaxSuppression)
{
// We want to have equally distributed features
// NOTE: If we have more grids than number of total points, we calc the biggest grid we can do
// NOTE: Thus if we extract 1 point per grid we have
// NOTE: -> 1 = num_features / (grid_x * grid_y))
// NOTE: -> grid_x = ratio * grid_y (keep the original grid ratio)
// NOTE: -> grid_y = sqrt(num_features / ratio)
// 当网格数量超过期望特征点数时,重新计算网格划分,保持原始宽高比。
// 防止有的网格没有特征点,也是为了保证特征点均匀分布,一个格子至少一个点
// num_features = (grid_x * grid_y)
// 又要保证宽高比例 double ratio = (double)grid_x / (double)grid_y;
// 综合上述两个式子就可以得到
if (num_features < grid_x * grid_y) {
double ratio = (double)grid_x / (double)grid_y;
grid_y = std::ceil(std::sqrt(num_features / ratio));
grid_x = std::ceil(grid_y * ratio);
}
// 每个网格提取 总特征数/网格数 + 1 个点,确保总数足够。
int num_features_grid = (int)((double

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



