Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV-SURF功能比较_C++_Objective C_Graphics_Opencv_Computer Vision - Fatal编程技术网

C++ OpenCV-SURF功能比较

C++ OpenCV-SURF功能比较,c++,objective-c,graphics,opencv,computer-vision,C++,Objective C,Graphics,Opencv,Computer Vision,我很好奇如何比较OpenCV特性描述符。例如,我可以使用cvExtractSURF()获取功能及其64位(或128位)描述符的列表,在哪里可以找到如何比较这两个描述符 在逐步浏览一些示例代码时,在我看来,我的两个“匹配”功能具有非常不同的描述符(至少通过数值) 有人知道如何获取两个描述符数组并比较它们吗 谷歌搜索帮不了什么忙 干杯, 布雷特你可能想看看报纸。这是一篇很棒的论文,介绍了广泛使用的特征检测器,包括SURF。SURF特征是64维单位向量。比较两个特征向量的自然方法是计算它们的点积。如果

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

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

有人知道如何获取两个描述符数组并比较它们吗

谷歌搜索帮不了什么忙

干杯,
布雷特

你可能想看看报纸。这是一篇很棒的论文,介绍了广泛使用的特征检测器,包括SURF。

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


尝试计算一些点积,看看结果如何。

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

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

我发现的一种有效方法(这是从一些OpenCV示例代码中获得的灵感)是- 使用k=2的k近邻搜索为查询对象中的每个描述符查找2个匹配项。现在,如果距离(第一匹配)<0.6×距离(第二匹配),将第一个匹配视为一个“好匹配”。
你之所以需要这个,以及为什么简单的1近邻搜索不够,是因为这会产生很多误报。

我真的看过那篇文章。我希望看到代码和它一起,这样我就可以看到它是如何实际实现的。然而,这些学术论文似乎都没有开源代码。令人失望的是,重新设计他们的工作从来都不是一件小事。我不确定OpenCV搜索匹配功能的方式是否是这样。我计算了OpenCV认为匹配和不匹配的点集的点积,点积到处都是。