OpenCV - SURF 功能比较

Posted

技术标签:

【中文标题】OpenCV - SURF 功能比较【英文标题】:OpenCV - SURF Feature Comparison 【发布时间】:2010-11-12 21:43:07 【问题描述】:

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

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

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

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

干杯, 布雷特

【问题讨论】:

【参考方案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 认为匹配和不匹配的点集的点积,点积到处都是。

以上是关于OpenCV - SURF 功能比较的主要内容,如果未能解决你的问题,请参考以下文章

PyCharm:为 SIFT、SURF 等操作安装非免费 OpenCV 模块

OpenCV竟然可以这样学!成神之路终将不远(三十六)

opencv动态背景下运动目标检测 FAST+SURF+FLANN配准差分 17/12/13更新图片

OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)

OpenCV竟然可以这样学!成神之路终将不远(三十六)

OpenCV竟然可以这样学!成神之路终将不远(三十六)