FAST 角点检测器中分数计算背后的算法

Say*_*lum 6 c++ opencv

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 feature Detector 中的 FAST 分数计算。任何人都可以给我对此的任何见解吗?

注意-我还看过第二篇论文“更快更好:角点检测的机器学习方法”,但它没有明确提到分数计算。

Vic*_*ian 6

网上的文档也让我困惑:

\n
\n

得分函数定义为:\n\xe2\x80\x9c连续弧内像素与中心像素之间的绝对差之和\npixel\xe2\x80\x9d

\n
\n

我很确定 OpenCV 不会这样计算分数。如果你耐心阅读你提到的源码,你会发现该函数cornerScore<16>是这样做的:

\n
    \n
  1. 获取以目标像素为中心的圆上的 16 个像素值
  2. \n
  3. 从 16 个像素中取出一组 9 个连续像素,计算 9 个像素与中心像素之间的绝对差异,并取最小值(来自 9 个绝对差异)值(称为阈值)
  4. \n
  5. 将这16个像素中的每一个像素作为第2步的开始,你将得到16个阈值
  6. \n
  7. 返回最大阈值作为角点分数
  8. \n
\n

从这个管道中,您可以看到 OpenCV 计算的分数是使目标像素成为 FAST-corner 的最大阈值。

\n

  • 该代码是高度优化的。在每次迭代中,它可以找到两个阈值,一个从d[k]到d[k+8],另一个从d[k+1]到d[k+9]。中间的 `if( a &lt;= a0 ) continue;` 用于提前终止(跳过当前迭代中不必要的比较)。因为如果d[k+1]到d[k+3]之间的最小值不高于旧阈值,则当前迭代计算的两个阈值也不会高于旧阈值。 (2认同)