OpenCV KeyPoint:有关角度和八度的信息

时间:2011-12-19 12:26:17

标签: opencv

我想了解更多关于KeyPoints的信息,所以有人能告诉我什么是


关键点::角

在OpenCV文档中提到角度是计算关键点的方向(如果不适用则为-1)。我无法想象它是什么。所以任何人都可以说我的意思或带来一个小例子。


关键点::倍频程

在OpenCV文档中提到了八度音程是八度音阶(金字塔层),从中提取了关键点。我无法想象它是什么。所以任何人都可以说我的意思或带来一个小例子。

5 个答案:

答案 0 :(得分:4)

如果您真的想了解基础知识,请转到基础知识:

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

这是关于图像特征描述/提取的第一篇也是最具影响力的论文之一。您可能会发现它有点难以接受,但它提供了对复杂问题的良好解释。

答案 1 :(得分: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 */

    ...
};

并根据Lowe的论文(http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf)通过几个步骤计算feat.ori,包括计算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; 
希望能帮助你

答案 2 :(得分:2)

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

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

我建议阅读&#34;学习OpenCV&#34;。它在OpenCV的API方面已经过时,但在那里讨论的理论得到了很好的解释。

答案 3 :(得分:2)

如果有人问这个问题,为什么*ngIf="authService.currentUser?.emailVerified" 为什么会有这么奇怪的值(例如16253184),那是因为它实际上携带着以下信息:

  • keypoint.octave字段的最低有效字节中的实际octave
  • keypoint.octave字段的第二个最低有效字节中的那个八度的layer
  • 通过SIFT关键点检测被打包到第三个最低有效字节中的东西,但未被SIFT描述符使用

keypoint.octave被解压缩为变量keypoint.octaveoctavelayerscale只是1/2 ^ scale),方法octave(请参阅OpenCV implementation)。

要直观地了解变量unpackOctaveoctave,此图像可能会有所帮助:

enter image description here

答案 4 :(得分:1)

这可能有助于八度音阶:

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

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