SIFT描述符匹配的有效方法

时间:2012-10-10 08:10:07

标签: opencv match kdtree feature-descriptor

有2张图像A和B.我从中提取关键点(a [i]和b [i])。
我想知道如何有效地确定[i]和b [j]之间的匹配?

显而易见的方法是将A中的每个点与B中的每个点进行比较。但是对于大型图像数据库而言,它过于耗时。我怎样才能将a [i]与b [k]进行比较,其中k是小范围的?

我听说 kd-tree 可能是一个不错的选择,不是吗?关于 kd-tree 有没有好的例子

还有其他建议吗?

3 个答案:

答案 0 :(得分:11)

KD树以一种在执行匹配时找到最相似的描述符真的更快的方式存储训练的描述符。

使用OpenCV,使用kd-tree非常简单,我将为你提供一个flann matcher的例子:

flann::GenericIndex< cvflann::L2<int> >  *tree; // the flann searching tree
tree = new flann::GenericIndex< cvflann::L2<int> >(descriptors, cvflann::KDTreeIndexParams(4)); // a 4 k-d tree

然后,当你进行匹配时:

const cvflann::SearchParams params(32);
tree.knnSearch(queryDescriptors, indices, dists, 2, cvflann::SearchParams(8));

答案 1 :(得分:9)

问题是天气你实际上想要确定两个图像之间的关键点匹配,或计算相似性度量

如果你想确定一个匹配,那么我担心你必须通过两个图像之间的所有可能的描述符对进行暴力搜索(有一些更高级的方法,如FLANN - 快速近似最近邻搜索,但是如果每个图像的关键点少于或大约2000个关键点,那么加速并不重要 - 至少根据我的经验。为了获得更准确的匹配(不是更快,只是更好的匹配),我建议你看一下:

另一方面,如果您只希望对大型数据库进行相似性度量,则适当的起点是:

答案 2 :(得分:4)

在OpenCV中,有几种策略可用于匹配关键点集。查看有关Common Interfaces of Descriptor Matchers的文档。