有 2 个图像 A 和 B。我从中提取关键点(a[i] 和 b[i])。
我想知道如何有效地确定 a[i] 和 b[j] 之间的匹配?
对我来说,显而易见的方法是将 A 中的每个点与 B 中的每个点进行比较。但是对于大型图像数据库来说,它非常耗时。我怎样才能将点 a[i] 与 k 范围较小的 b[k] 进行比较?
我听说kd-tree可能是一个不错的选择,不是吗?有没有关于kd-tree 的好例子?
还有其他建议吗?
有 2 个图像 A 和 B。我从中提取关键点(a[i] 和 b[i])。
我想知道如何有效地确定 a[i] 和 b[j] 之间的匹配?
对我来说,显而易见的方法是将 A 中的每个点与 B 中的每个点进行比较。但是对于大型图像数据库来说,它非常耗时。我怎样才能将点 a[i] 与 k 范围较小的 b[k] 进行比较?
我听说kd-tree可能是一个不错的选择,不是吗?有没有关于kd-tree 的好例子?
还有其他建议吗?
KD 树以一种在执行匹配时找到最相似的描述符的速度非常快的方式存储训练好的描述符。
使用 OpenCV,使用 kd-tree 真的很容易,我会给你一个 flann 匹配器的例子:
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));
问题是您实际上想要确定两个图像之间的关键点匹配或计算相似性度量的天气。
如果你想确定一个匹配,那么恐怕你将不得不通过两个图像之间所有可能的描述符对进行暴力搜索(有一些更高级的方法,例如 FLANN - Fast Approximate Nearest Neighbor Search,但加速是如果每张图像的关键点少于或大约 2000 个,则并不重要——至少根据我的经验)。为了获得更准确的匹配(不是更快,只是更好的匹配),我建议你看看:
另一方面,如果您只想对大型数据库进行相似性度量,那么合适的起点是:
在 OpenCV 中,实施了几种策略来匹配关键点集。查看有关描述符匹配器的通用接口的文档。