OpenCV SURF描述符匹配

时间:2014-03-05 06:36:26

标签: c++ opencv surf

这是比较我在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;
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

enter image description here

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

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

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