FAST角点检测中得分计算的算法背后是什么?

6
在FAST角点检测器中,如何计算检测到的角点的分数?我阅读了原始论文“用于高速角点检测的机器学习”,但在分数计算部分没有明确说明它们正在引用哪些N个连续像素。它是满足该点角点标准的N个连续像素吗?我还发现下面的链接https://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/AV1011/AV1FeaturefromAcceleratedSegmentTest.pdf讲述了FAST角点分数计算。此外,我没有找到本文所描述的分数函数与OPENCV对半径为3的Bresenham圆进行的分数计算之间的任何对应关系。

https://github.com/opencv/opencv/blob/master/modules/features2d/src/fast_score.cpp

在上面链接中,分数已经在cornerScore<16>函数中计算。除此之外,没有其他文章明确讨论Fast特征检测器中的FAST分数计算。有人可以给我任何关于这个的见解吗?
注:我也看过第二篇论文“更快更好:一种机器学习方法用于角点检测”,但它没有明确提到分数计算。

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_fast/py_fast.html 在那里我认为解释得很清楚。 - Micka
但是OPENCV的实现并没有遵循那个得分计算方法。 - Sayan Barrie Mccullum
1个回答

6

我也被在线文档搞糊涂了:

评分函数定义为: “相邻弧线上的像素与中心像素之间的绝对差值之和”

我非常确定OpenCV不是这样计算分数的。如果您耐心地阅读您提到的源代码,您将发现函数cornerScore<16>执行以下操作:

  1. 获取以目标像素为中心的圆圈上的16个像素值
  2. 从16个像素值中选择一个连续的9个像素组合,并计算这9个像素与中心像素之间的绝对差值,取最小值(即称为阈值
  3. 以每个像素作为步骤2的起始像素,你将得到16个阈值
  4. 返回最大阈值作为角点分数

从这个流程中,您可以看到OpenCV计算的分数是使目标像素成为FAST角点的最大阈值


感谢您提供了详细的解释,我已经反复阅读了源代码,但由于缺乏相关的先验知识,一直很难理解。您是个天才,先生!我还想知道为什么要找到d[k+1]、d[k+2]和d[k+3]的最小值,然后再与旧的阈值进行比较。我们应该直接计算d[k]到d[k+8]的最小值,然后再进行比较。 - Sayan Barrie Mccullum
2
代码高度优化。在每次迭代中,它可以找到两个阈值,一个从 d[k] 到 d[k+8],另一个从 d[k+1] 到 d[k+9]。中间的 if( a <= a0 ) continue; 是为了提前终止(跳过当前迭代中不必要的比较)。因为如果 d[k+1] 到 d[k+3] 之间的最小值不高于旧阈值,则当前迭代中计算出的两个阈值也不会高于旧阈值。 - VictorBian
天才先生,天才 - Sayan Barrie Mccullum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接