【问题标题】:OpenCV KeyPoint: information about angle and octaveOpenCV KeyPoint:关于角度和八度的信息
【发布时间】:2020-03-30 16:49:29
【问题描述】:

我想了解更多关于 KeyPoints 的信息,谁能告诉我是什么


关键点::角度

在 OpenCV 文档中提到角度是计算关键点的方向(如果不适用,则为 -1)。我无法想象它是关于什么的。所以谁能告诉我这是什么意思或举一个小例子。


KeyPoint::octave

在 OpenCV 文档中提到 octave 是从中提取关键点的 octave(金字塔层)。我无法想象它是关于什么的。所以谁能告诉我这是什么意思或举一个小例子。

【问题讨论】:

    标签: opencv


    【解决方案1】:

    如果你真的想了解基础知识,就去基础知识吧:

    http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf

    这是关于图像特征描述/提取的第一篇,也是最具影响力的论文之一。你可能会觉得有点难以接受,但它很好地解释了一个复杂的问题。

    【讨论】:

    • 虽然本文处理的是 SIFT,但应该注意的是 OpenCV 提供了其他特征检测算法,例如 SURF,它们也返回这些关键点。概念还是一样的。
    【解决方案2】:

    如果有人不想阅读 @sammy 提到的 Lowe 的论文,这里有一些简短的简历:

    • 图像金字塔(请参阅OpenCV docwiki)基本上是一组基于单个图像的图像,我们已经对其进行了多次下采样和缩小。这种金字塔的一个例子是高斯金字塔。由于各种原因,我们在特征检测和匹配中使用金字塔。过去已经注意到,将图像下采样并将图像缩小到一定水平并不意味着我们会丢失特征匹配所需的所有特征,实际上它通常会消除一些噪声。高分辨率(不要与图像的宽度和高度混淆!)通常也不是我们需要的,因为(维基百科)更高的分辨率也意味着图像中的更多细节,但更多细节也意味着需要更多的处理能力,这是一个杀手如果你在一个低性能和低功耗的平台上运行你的应用程序,比如智能手机。如果你把它与你的图像(尺寸)的巨大比例结合起来,整个事情会变得更糟。当然,这取决于图像和金字塔的层数。正如我们所知,下采样会以某种方式改变图像中的像素。每个特征都由一个关键点和一个描述符来描述。由于下采样特征时像素的变化也会发生变化,因此它们的描述符和关键点也会发生变化。这就是为什么关键点必须将信息存储在图像金字塔中提取它的哪个级别。请注意,创建图像金字塔需要大量资源。但是,当您开始对这些图像进行其他操作(例如匹配)时,这种权衡是合理的。
    • 关键点角度与关键点所代表的特征的方向有关。关键点实际上不是单个像素,而是特征内部的一个小区域(调用 .pt.x 和 .pt.y 只返回关键点的中心),因此当改变它的方向时,像素会从关键点的角度改变它们的位置.想象一下,你有一所房子,有门、屋顶等。我们提取了那所房子的一些特征。然后我们将相机倒置并从完全相同的位置拍摄一张新照片。如果特征提取器支持方向,我们应该(几乎)获得与我们在相机方向改变之前拍摄的照片中相同的特征(因此相同的关键点)。如果特征提取器支持方向,我们可能会丢失之前检测到的大部分特征和/或获得新特征。

    我推荐阅读“学习 OpenCV”。它在 OpenCV 的 API 方面已经过时,但那里讨论的理论解释得很好。

    【讨论】:

      【解决方案3】:

      虽然我知道角度和八度的概念,但我想知道float angle是什么意思,所以我查看了OpenCV2.3.1的源代码
      sift.cpp

      inline KeyPoint featureToKeyPoint( const feature& feat )
      {
          float size = (float)(feat.scl * SIFT::DescriptorParams::GET_DEFAULT_MAGNIFICATION() * 4); // 4==NBP
          float angle = (float)(feat.ori * a_180divPI);
          return KeyPoint( (float)feat.x, (float)feat.y, size, angle, feat.response, feat.feature_data->octv, feat.class_id );
      }
      

      好的,我得到了角度定义,但是 feat.oria_180divPI 是什么
      后者很容易找到

      const double a_180divPI = 180./CV_PI;
      

      前者需要一些努力,经过几个方法,我得到了

      struct feature
      {
          double x;                      /**< x coord */
          double y;                      /**< y coord */
      
          double scl;                    /**< scale of a Lowe-style feature */
          double ori;                    /**< orientation of a Lowe-style feature */
      
          ...
      };
      

      feat.ori 是根据 Lowe 的论文 (http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf) 通过几个步骤计算出来的,包括计算 ori_hist、平滑直方图和 add_good_ori_feature。
      我不是 100% 确定 ori 的确切含义,但我强烈怀疑 OpenCV 是否已将 ori 转换为适当的弧表示,最终结果 angle 是从 -180 开始的正常含义天使范围度到 180 度。证据是

      1) ori = arctan2( dy, dx)
      2) bin = cvRound( n * ( ori * CV_PI ) / PI_2 )
      3) new_feat->ori = ( ( PI2 * bin ) / n ) - CV_PI; 
      

      希望能帮到你

      【讨论】:

      • 编辑:我使用 OpenCV2.3.1。对于SIFT,角度在-180 到180 度之间。但是,对于SURF,角度在0 到360 度之间。我不知道为什么。另请注意,在新文档中,它说 -1 if not applicable [link](docs.opencv.org/modules/features2d/doc/… angle)
      【解决方案4】:

      如果有人提出这个问题想知道为什么keypoint.octave 有这样一个奇怪的值(例如 16253184),那是因为它实际上携带了以下信息:

      • keypoint.octave 字段的最低有效字节中的实际 octave
      • keypoint.octave 字段的第二个最低有效字节中该倍频程的layer
      • 其他东西被 SIFT 关键点检测打包到第三个最低有效字节中,但未被 SIFT 描述符使用

      keypoint.octave 使用 unpackOctave 方法解压缩到变量 octavelayerscalescale 只是 1/2^octave)中(参见 OpenCV implementation)。

      为了直观地理解变量octavelayer,这张图片可能会有所帮助:

      【讨论】:

        【解决方案5】:

        这可能对八度音阶有所帮助:

        http://en.wikipedia.org/wiki/Gaussian_pyramid

        基本上,图像有不同程度的模糊。找到该特征的程度是该特征的“八度”级别。

        【讨论】:

        • 要了解八度音程的含义,您可以说它编码了计算描述符所需的特征的“大小”及其邻域。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-12
        • 1970-01-01
        • 2012-06-21
        • 2019-01-24
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        相关资源
        最近更新 更多