我正在使用SIFT的VLFEAT实现来计算两组图像上的SIFT描述符:查询和数据库图像。给定一组查询,我想从描述符的大数据库中获取最接近的描述符,我使用vl_ubcmatch。
将vl_ubcmatch语法设为MATCHES = vl_ubcmatch(DESCR1, DESCR2)
如果我首先输入查询描述符而将数据库描述符作为第二个参数或相反的方式输入,我会得到不同的结果。
哪种语法正确?
1)MATCHES = vl_ubcmatch(QUERY_DESCR,DATABASE_DESCR)
或
2)MATCHES = vl_ubcmatch(DATABASE_DESCR,QUERY_DESCR)
答案 0 :(得分:1)
如果我首先输入查询描述符而将数据库描述符作为第二个参数或相反的方式输入,我会得到不同的结果。
这是因为此方法在幕后使用比率测试 [1]算法,即比较最近邻居的距离与第二近邻居的距离
vl_feat实现默认使用阈值1.5
,如下所示:
if(thresh * (float) best < (float) second_best) {
/* accept the match */
}
此比率测试不对称,这就是为什么在交换输入时可以获得匹配集之间的差异。
如果您对此不满意,可以参考使用OpenCV库进行计算机视觉编程 Chapter 9,建议采用实用的方法对匹配进行对称化,如下所示:
从这些[匹配]集合中,我们现在将提取一致的匹配项 两套。这是对称的匹配方案,强加于 要接受匹配对,两个点必须是最佳匹配 另一个的特点。
[1]见D. Lowe的论文中的7.1 Keypoint Matching。
答案 1 :(得分:0)
MATCHES = vl_ubcmatch(DESCR1, DESCR2)
中每个描述符的 DESCR1
搜索DESCR2
中最近的描述符,如果匹配通过测试,则将其添加到输出中(有关详细信息,请参阅deltheil的答案)。
所以我相信MATCHES = vl_ubcmatch(QUERY_DESCR,DATABASE_DESCR)
是您想要的变体。