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

标签 java opencv sift surf homography

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

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

任何像这样的应用程序的教程或示例将不胜感激。

Test building facade matching

最佳答案

你基本上会存储

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

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

您目前遇到什么问题?您的数据库需要多少空间?匹配速度?或者可能匹配质量?根据您的答案,您可能会得到不同的方法。

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

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

如果您遇到内存问题,您可以尝试限制每个引用图像的特征点数量(按分数执行降序排序,仅保留 N 个最佳特征)。您还可以使用更小的描述符(SURF over SIFT 等)。但我不认为这是可能的情况,因为每个引用图像需要大约 100-1000 个特征,并且假设您使用具有 128 个浮点的 SIFT 描述符,每个图像将获得 1000*128*4 = 500 KB。使用每个引用图像 200 个点和具有 64 个浮点的 SURF 描述符将为每个图像提供 50 KB。您可以更进一步,使用 chars for SURF 并获得每个图像约 13 kB,但匹配质量可能会降低。

关于java - 使用 OpenCV SURF 对多个图像进行图像匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34300051/

相关文章:

java - 二进制数据的未知编码/序列化

java - 为什么我的服务器和客户端在服务器 Activity 开始时断开连接?

php - 如何将 PHP 中从网络摄像头捕获的图像发送到 Python

python - OpenCV Python中的Streamlink流数据处理

匹配多个图像时的 SIFT 特征匹配性能

java - 每次更改我的 Java 代码时,我可以阻止重新启动我的应用程序吗?

opencv - 当尝试使用适用于 Windows 桌面的 Visual Studio 2012 在 Windows 8 64 位上从源构建 sikuli 时,cmake 会引发以下问题

c++ - SIFT 算法中的奇怪 Octave 值?

python - OpenCv Python SIFT-如何减少关键点的数量?

java - 通用捕获声明