使用 OpenCV SURF 对多个图像进行图像匹配

Image matching against multiple images with OpenCV SURF

我正在尝试创建一个应用程序,将建筑物立面的图像与我的数据库中的图像相匹配(参见下面的示例图像)。我正在 Java 中实施该应用程序,到目前为止我一直在学习本教程: http://docs.opencv.org/2.4/doc/tutorials/features2d/feature_homography/feature_homography.html

我需要帮助的是如何进入下一步并调整我的代码,以便我提取存储的图像以匹配输入图像。我该怎么做?我是否将图像本身和每个图像的关键点存储在数据库中?还是存储描述符匹配器?

如有任何此类应用程序的教程或示例,我们将不胜感激。

你基本上会存储

  • 允许匹配的描述符
  • 相应关键点的位置,以允许根据几何约束拒绝匹配

您实际上不必存储每张图片,但您可能希望为每个建筑物至少存储一张以向用户显示最佳匹配。

您目前有什么问题?您的数据库需要 space 的数量?匹配速度?或者匹配质量?根据您的回答,您可能会得到不同的方法。

我会首先尝试实现最简单的方法,只是遍历从数据库中的参考图像中提取的数据并尝试匹配您的图像。您可以 select 产生最大内点的参考图像,然后检查它们的数量是否高于某个经验定义的阈值以确定您是否匹配。

如果您遇到性能问题,您可以尝试利用您事先准备基础的事实并预先计算一些有用的东西。一个例子是几棵 k-d 树,或者一棵 k-d 树具有来自 all 图像的特征(存储每个特征来自的索引),然后进行一些修改的匹配(允许每个关键点来自源图像以匹配多个关键点(如果它们来自不同的参考图像)。然后在匹配和几何测试之后检查哪个参考图像获得最大匹配。

如果您的记忆力有问题,您可以尝试限制每个参考图像的特征点数量(按分数降序排序,只保留 N 个最佳特征)。您还可以使用更小的描述符(SURF over SIFT 等)。但我不认为这是可能的情况,因为每个参考图像需要大约 100-1000 个特征,并且假设您使用带有 128 个浮点数的 SIFT 描述符,每个图像将获得 1000*128*4 = 500 KB。每个参考图像使用 200 个点和 64 个浮点数的 SURF 描述符将为您提供每个图像 50 KB。您可以走得更远,将字符用于 SURF,每张图像约 13 kB,但匹配质量可能会降低。