SIFT描述符匹配的有效方法

van*_*exu 6 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有什么好的例子吗?

还有其他建议吗?

Jav*_*ock 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
Run Code Online (Sandbox Code Playgroud)

然后,当你进行匹配时:

const cvflann::SearchParams params(32);
tree.knnSearch(queryDescriptors, indices, dists, 2, cvflann::SearchParams(8));
Run Code Online (Sandbox Code Playgroud)

  • 当您标记应该是评论的答案或仅仅是链接时,请将它们标记为"非答案"而不是"非常低质量",它从工作流程角度帮助我们.但是继续萎靡不振,我们很感激! (2认同)

pen*_*ope 9

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

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

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


rem*_*emi 5

在 OpenCV 中,实现了多种策略来匹配关键点集。查看有关描述符匹配器通用接口的文档。