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

时间:2015-12-15 21:49:23

标签: java opencv sift surf homography

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

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

非常感谢任何此类应用程序的教程或示例。

Test building facade matching

1 个答案:

答案 0 :(得分:1)

你基本上会存储

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

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

您目前有什么问题?数据库所需的空间量?匹配速度?或者可能匹配质量?根据您的回答,您可能会采用不同的方法。

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

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

如果您遇到内存问题,可以尝试限制每个参考图像的特征点数量(按分数降序排序,只留下N个最佳特征)。您还可以使用较小的描述符(SURF over SIFT等)。但我不认为这可能是这种情况,因为每个参考图像需要大约100-1000个特征,假设您使用带有128个浮点数的SIFT描述符,每个图像将获得1000 * 128 * 4 = 500千字节。每个参考图像使用200个点,使用64个浮点数的SURF描述符将为每个图像提供50千字节。你可以更进一步,使用字符表示SURF,每张图像得到~13 kB,但匹配的质量可能会降低。

相关问题