【问题标题】:OpenCV - SURF Feature ComparisonOpenCV - SURF 功能比较
【发布时间】:2024-01-21 16:12:01
【问题描述】:

我很好奇OpenCV 特征描述符是如何比较的。例如,我可以使用cvExtractSURF() 获取功能列表及其 64 位(或 128 位)描述符,我在哪里可以找到如何比较两个描述符?

在逐步执行一些示例代码时,在我看来,我的两个“匹配”功能具有非常不同的描述符(至少在数值上)。

有没有人弄清楚如何获取两个描述符数组并比较它们?

谷歌搜索并没有太大帮助......

干杯, 布雷特

【问题讨论】:

    标签: c++ objective-c graphics opencv computer-vision


    【解决方案1】:

    您可能想查看论文Local invariant feature detectors: a survey。这是一篇很棒的论文,描述了广泛使用的特征检测器,包括 SURF。

    【讨论】:

    • 我真的看到了那篇论文。我希望看到它的代码,所以我可以看到它是如何实际实现的。然而,这些学术论文似乎都没有开源他们的代码。令人失望的是,重新发明他们的工作绝非易事。
    【解决方案2】:

    在 OpenCV 2.1 示例文件 find_obj.cpp 中,提出了两种方法:

    • 内置的 C++ Flann 函数(flann 提供近似解决方案并且工作速度更快),我不知道它是如何工作的,但它记录在 here
    • 一个更简单的 C 函数 (findPairs()),它通过计算描述符之间的简单欧几里德距离来找到最近的邻居(查看 compareSURFDescriptors() 函数)。拉普拉斯算子也可以用作相似性的第一个指标,因为匹配点具有不同的拉普拉斯算子(1 或 -1)。此示例可用here

    【讨论】:

      【解决方案3】:

      我发现的一种有效方法(这受到一些 OpenCV 示例代码的启发)是 - 使用 K=2 的 k 最近邻搜索为查询对象中的每个描述符找到 2 个匹配项。现在,如果 distance(1st match)

      您需要这个以及为什么简单的 1 个最近邻搜索还不够的原因是因为这会产生很多误报。

      【讨论】:

        【解决方案4】:

        SURF 特征是 64 维的单位向量。比较两个特征向量的一种自然方法是计算它们的点积。如果接近 1,则它们具有很强的正相关性(=它们相似)。如果它接近 0,则它们几乎是正交的(无相关性)。如果它小于零,则它们具有负相关性。根据您的应用程序,您可能也认为匹配(在这种情况下,您将采用点积的绝对值)或认为它比正交更差。

        尝试计算一些点积,看看会得到什么结果。

        【讨论】:

        • 我不确定这是 OpenCV 搜索匹配特征的方式。我计算了 OpenCV 认为匹配和不匹配的点集的点积,点积到处都是。