OpenCV - SURF功能比较

问题描述:

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

在通过一些示例代码步进,对我来说,它看起来像我的两个“匹配”功能具有非常不同的描述符(至少数值)。

有没有人知道如何获取两个描述符数组并对它们进行比较?

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

干杯, 布雷特

在OpenCV的2.1示例文件find_obj.cpp,两种方法都:

  • 内置C++弗莱恩功能(FLANN给aproximate解决方案和工作速度更快),我完全不知道是怎么回事作品,但它被记录在here
  • 更简单的C函数(findPairs()),其通过计算描述符之间的简单的欧几里德距离(看compareSURFDescriptors()函数)发现最近邻。拉普拉斯算子也可以用作第一个相似度指标,因为匹配点并不是相同的拉普拉斯算子(1或-1)。此样品可用here

你可能想看看纸Local invariant feature detectors: a survey。这是一篇很好的论文,介绍了广泛使用的特征探测器,包括SURF。

+4

我真的看到了那张纸。我希望看到它的代码,所以我可以看到它是如何实现的。然而,这些学术论文似乎都没有开源他们的代码。令人失望,因为重塑他们的工作从来都不是微不足道的。 – Brett 2010-11-12 22:05:50

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

尝试计算一些点积,并查看得到的结果。

+0

我不确定这是OpenCV搜索匹配功能的方式。我计算了OpenCV认为匹配和不匹配的一组点的点积,并且点积遍布整个地方。 – Brett 2010-11-16 18:40:14

一种有效的方法,我发现(这是从一些OpenCV的样本代码的启发)是 - 使用k近邻搜索具有K = 2找到2个匹配在查询对象中的每个描述符。现在,如果距离(第一场比赛)< 0.6 *距离(第二场比赛),将第一场比赛视为“良好比赛”。

为什么你需要这个,为什么一个简单的1个近邻搜索是不够的,因为这给了假阳性很多原因。