特征检测_FAST特征点检测

1. FAST简介

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

2. FAST算法步骤

在这里插入图片描述

  1. 在图像中选择一个像素p,假设该像素的强度为 IP。
  2. 设置一个阈值强度 T(例如为被测试像素强度的 20%)。
  3. 考虑围绕像素 p 的 16 个像素组成的圆。
  4. 如果检测该像素为兴趣点,则16个像素中需要有N个连续像素的强度要么高于 IP+T,要么低于 IP-T。(作者在算法的第一个版本中使用 N = 12)
  5. 为了加快算法,首先将圆上的第 1、5、9 和 13 个像素的强度与 IP 进行比较。这四个像素中至少有三个应满足阈值条件,p才可能为兴趣点。
  6. 如果四个像素值 1、5、9、13 中至少有三个未满足高于或低于 IP±T 的条件,则 p 不是兴趣点(角点)。在这种情况下,直接将像素 p 排除。否则,如果至少有三个像素的值高于或低于 IP ± T,则检查所有16个像素,判断是否有12个连续像素符合该标准。
  7. 对图像中的所有像素重复这一过程。

3. 算法后处理

3.1 非极大值抑制

在初始版本的算法中,检测到彼此相邻的多个兴趣点是另一个问题。这可以通过在检测兴趣点后应用非极大值抑制来解决。

  1. 对每个检测到的点计算得分函数V。得分函数定义为:连续弧线上的像素与中心像素的绝对差值之和。
  2. 考虑两个相邻的兴趣点(可以是MM的邻域:33 / 5*5),比较它们的V值。
  3. 舍弃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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值