OpenCV - SURF 特征比较

9
我对如何比较OpenCV特征描述符很感兴趣。例如,我可以使用cvExtractSURF()获取一系列特征及其64位(或128位)描述符,但我在哪里可以找到两个描述符如何比较的信息?
通过查看一些示例代码,我发现我的“匹配”特征的两个描述符非常不同(至少从数值上看)。
有人曾经想过如何将两个描述符数组进行比较吗?
谷歌搜索并没有太大帮助...
祝好, Brett
4个回答

7

4
我确实看过那篇论文。我希望能够看到论文附带的代码,这样可以了解它是如何被实现的。然而,似乎没有哪一篇学术论文公开其代码。这令人失望,因为重新发明他们的工作从未是一件简单的事。 - Brett

3
在OpenCV 2.1示例文件find_obj.cpp中,提供了两种方法:
  • 内置的C++ Flann函数(flann提供近似解并且速度更快),我不确定它是如何工作的,但可以在这里找到相关文档。
  • 一个更简单的C函数(findPairs()),它通过计算描述符之间的简单欧几里得距离来查找最近邻居(请查看compareSURFDescriptors()函数)。拉普拉斯也可以用作相似性的第一指标,因为匹配点的拉普拉斯值不同(为1或-1)。该示例文件可在这里获取。

3
我发现的一种有效方法(受启发于OpenCV的一些示例代码)是 - 使用K=2的k最近邻搜索,为查询对象中的每个描述符找到2个匹配项。现在,如果距离(第一个匹配项)< 0.6 * 距离(第二个匹配项),则将第一个匹配项视为“好匹配”。
你需要这样做的原因以及为什么简单的1最近邻搜索不够用,是因为它会产生很多误报。

2
SURF特征是64维的单位向量。比较两个特征向量的一种自然方法是计算它们的点积。如果接近1,则它们具有强正相关性(=相似)。如果接近0,则它们几乎正交(无关联)。如果小于零,则它们具有负相关性。根据您的应用程序,您可能会考虑将其视为匹配项(在这种情况下,您将取点积的绝对值)或将其视为劣于正交。
尝试计算一些点积并查看结果。

我不确定这是否是OpenCV搜索匹配特征的方式。我计算了一组点的点积,这些点是OpenCV认为匹配和不匹配的,但点积结果却非常混乱。 - Brett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接