OpenCV - SURF特征比较

时间:2010-11-12 21:43:08

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

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

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

有没有人想出如何获取两个描述符数组并进行比较?

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

干杯, 布雷特

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

你需要这个的原因以及为什么一个简单的1邻近搜索是不够的,因为这会产生大量的误报。

答案 3 :(得分:2)

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

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