【问题标题】:Image matching against multiple images with OpenCV SURF使用 OpenCV SURF 与多个图像进行图像匹配
【发布时间】:2016-03-21 21:11:08
【问题描述】:

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

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

任何此类应用程序的教程或示例将不胜感激。

【问题讨论】:

    标签: java opencv sift surf homography


    【解决方案1】:

    你基本上会存储

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

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

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

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

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

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

    【讨论】:

    • 我还没有开始实现我的应用程序的这一部分,所以我想知道如何存储您在帖子中指出的信息?我见过一些例子,人们将它们存储在矩阵中,然后在遍历存储的图像时检索信息,并简单地使用检索到的信息与输入图像进行匹配。另外我如何确定图像是否匹配?
    • 我知道您正在寻找某种“最佳实践”,但不幸的是,我没有使用数据库匹配图像的经验,因此我的建议可能无关紧要。因此,为了避免过早的优化,最好先尝试简单的方法,然后看看它需要改进的地方。无论如何,我在回答中添加了一些想法。
    猜你喜欢
    • 2012-12-31
    • 2022-01-09
    • 1970-01-01
    • 2012-04-02
    • 2018-06-21
    • 2015-06-29
    • 2015-04-05
    • 2016-06-30
    • 1970-01-01
    相关资源
    最近更新 更多