【问题标题】:OpenCV SURF descriptor matchingOpenCV SURF 描述符匹配
【发布时间】:2014-03-05 06:36:26
【问题描述】:

这是我在 OpenCV 示例的 find_obj.cpp 中找到的用于比较 SURF 描述符的函数。我基本上无法理解如何计算描述符之间的欧几里得距离。

是一次计算每个第 i 个描述符还是整个图像?

我知道这是一个基本问题,但我非常感谢您的回复。 谢谢。

double
compareSURFDescriptors( const float* d1, const float* d2, double best, int length )
{
    double total_cost = 0;
    assert( length % 4 == 0 );
    for( int i = 0; i < length; i += 4 )
    {
        double t0 = d1[i  ] - d2[i  ];
        double t1 = d1[i+1] - d2[i+1];
        double t2 = d1[i+2] - d2[i+2];
        double t3 = d1[i+3] - d2[i+3];
        total_cost += t0*t0 + t1*t1 + t2*t2 + t3*t3;
        if( total_cost > best )
            break;
    }
    return total_cost;
}

【问题讨论】:

    标签: c++ opencv surf


    【解决方案1】:

    对于图像 1 中的每个第 i 个描述符到图像 2 中的每个第 j 个描述符。

    【讨论】:

      【解决方案2】:

      主要基于文献(Bay et al. 2004)的解释。

      假设我们有一张检测到关键点的图像。为了计算关键点的描述符,在其周围定义了一个正方形区域(根据论文,使用大小为20s 的窗口,其中s 是检测到关键点的比例)。然后将该区域划分为 4X4=16 个正方形子区域(见图)。对于这些子区域中的每一个,计算描述符 4 值会产生一个 4 维向量 vi=[a1i,a2i,a3i,a4i] 用于 i=[1:16](请参阅论文或 here 以了解这些值是什么)。因此,描述符的最终向量一个接一个地累加这 16 个 4-dim 向量的值。因此,描述符产生一个 16*4=64-dim 向量。

      总结:每个关键点由一个 64 向量描述。该向量中的每 4 个值描述了关键点附近的 16 个子区域之一。 (扩展版SURF-128也可以是128)

      因此,如果您在整个 c++ 代码中看到,此函数的输入只是来自对象 (d1) 的一个描述符(一个关键点)和来自图像 (d2) 的一个描述符。基本上,比较是在 2 个 64 维向量(或扩展版本的情况下为 128 个)之间进行的。向量的长度应该是 4 的倍数的断言验证了这些描述符是由一个接一个地附加的 4-dim 向量形成的。

      为了确定对象的关键点是否与图像的关键点相似,您可以比较它们周围的相同子区域。出于这个原因,每 4 个值都被比较在一起(计算它们的差异/距离)并且总成本增加(基于它们的不同程度)。如果总成本变得大于阈值(最佳),则没有理由继续比较,点不相似!

      我希望这会有所帮助,我并没有让你更加困惑!

      【讨论】:

        猜你喜欢
        • 2011-06-22
        • 2011-11-09
        • 2012-04-16
        • 1970-01-01
        • 2014-05-07
        • 2013-09-05
        • 2012-06-14
        • 2012-06-22
        • 2015-06-29
        相关资源
        最近更新 更多