1

我正在使用 SIFT 的 VLFEAT 实现来计算两组图像的 SIFT 描述符:查询和数据库图像。给定一组查询,我想从一个大型描述符数据库中获取最接近的描述符,为此我使用 vl_ubcmatch。

MATCHES = vl_ubcmatch(DESCR1, DESCR2)如果我首先输入查询描述符并将数据库描述符作为第二个参数或以其他方式输入,则使用vl_ubcmatch 语法会获得不同的结果。

哪个是正确的语法?

1)MATCHES = vl_ubcmatch(QUERY_DESCR,DATABASE_DESCR)

或者

2)MATCHES = vl_ubcmatch(DATABASE_DESCR,QUERY_DESCR)

4

2 回答 2

1

如果我首先输入查询描述符,然后输入数据库描述符作为第二个参数,或者相反,我会得到不同的结果。

这是因为该方法在幕后使用了比率测试[1]算法,即比较最近邻与次近邻的距离

vl_feat 实现默认使用如下阈值1.5

if(thresh * (float) best < (float) second_best) {
  /* accept the match */
}

此比率测试不是对称的,这就是为什么您可以在交换输入时获得匹配集之间的差异。

如果您对此不满意,可以参考使用 OpenCV 库的计算机视觉编程 第 9 章,它提出了一种实用的方法来对称化匹配,如下所示:

从这些 [matching] 集合中,我们现在将提取与这两个集合一致的匹配。这是对称匹配方案,对于要接受的匹配对,两个点都必须是另一个点的最佳匹配特征。

[1] 参见D. Lowe 论文中的7.1 关键点匹配

于 2013-06-25T22:14:35.340 回答
0

MATCHES = vl_ubcmatch(DESCR1, DESCR2)对于每个描述符,DESCR1搜索最接近的描述符,DESCR2如果匹配通过测试,则将其添加到输出中(有关更多详细信息,请参见 deltheil 的答案)。所以我相信MATCHES = vl_ubcmatch(QUERY_DESCR,DATABASE_DESCR)是你想要的变种。

于 2013-06-26T13:43:06.807 回答