我很好奇如何比较OpenCV
特征描述符。例如,我可以使用cvExtractSURF()
来获取功能列表及其64位(或128位)描述符,在哪里可以找出如何比较两个描述符?
在单步示例代码中,对我来说,看起来我的两个“匹配”功能具有非常不同的描述符(至少通过数值)。
有没有人想出如何获取两个描述符数组并进行比较?
谷歌搜索没有太多帮助......
干杯, 布雷特
答案 0 :(得分:7)
您可能希望查看论文Local invariant feature detectors: a survey。这是一篇很棒的论文,描述了广泛使用的特征探测器,包括SURF。
答案 1 :(得分:3)
在OpenCV 2.1示例文件find_obj.cpp中,提供了两种方法:
答案 2 :(得分:3)
我发现的一种有效方法(这是受一些OpenCV示例代码的启发)是 - 使用K = 2的k最近邻居搜索来查找查询对象中每个描述符的2个匹配项。现在,如果距离(第一场比赛)< 0.6 *距离(第二场比赛),将第一场比赛视为“好比赛”。
你需要这个的原因以及为什么一个简单的1邻近搜索是不够的,因为这会产生大量的误报。
答案 3 :(得分:2)
SURF特征是64维单位矢量。比较两个特征向量的一种自然方法是计算它们的点积。如果接近1,则它们具有强烈的正相关性(=它们相似)。如果它接近0,它们几乎是正交的(没有相关性)。如果它小于零,则它们具有负相关性。根据您的应用程序,您可能会考虑匹配(在这种情况下,您将采用点积的绝对值)或认为它比正交更差。
尝试计算一些点积,看看你得到了什么结果。