将一个图像中的 SURF 描述符与其他图像中的描述符列表进行比较

Posted

技术标签:

【中文标题】将一个图像中的 SURF 描述符与其他图像中的描述符列表进行比较【英文标题】:Compare SURF descriptors in one image to a list of descriptors in other images 【发布时间】:2012-01-09 15:03:33 【问题描述】:

我想将一张图像 (A) 中的 SURF 描述符与其他几张图像 (B,C,D,..) 中的描述符进行比较,以找到与 A 最相似的图像。描述符有 64 个维度。

使用 C# 和 Emgu,通过将 A 的描述符与 B 的描述符进行比较来完成匹配,然后是 C 的描述符,然后是 D 的描述符,依此类推。当图像数量超过 10 时,这非常慢,因为必须搜索许多不相关的描述符。

为了加快这个过程,正确的方法(根据文章)似乎是为 (B,C,D,..) 中的描述符构建一个 kd-tree 以快速匹配找到 A 中的描述符.kd-tree根据层级进行维度拆分。第一次拆分由第一维决定,第二次拆分由第二维等决定。但是,在描述符(64)的维数很高时,使用 KD-tree 的好处变得更小。

所以我的问题是:在使用 KD-tree/其他方法将 SURF 描述符从一个图像 (A) 匹配到多个图像 (B、C、D..) 方面,您有什么经验或知识。哪些工作做得好,哪些做得不好,你做过这样的事情吗?

FLANN 在这里是一个选项,因为它被 OpenCV 使用,但我找不到 C# 的版本。大约最近的 Neightboor 也是加速 kd-tree 的一个选项,但它是否适用于匹配图像?

最好的问候 莫腾

【问题讨论】:

【参考方案1】:

您可以在 C 或 C++ 上尝试FLANN。也不算太复杂。

但是,我在 C++ 上测试 FLANN,但匹配时间(使用 SURF 特征,FLANN,查询 1000 张图像)非常长,从 20 秒到 400 秒(取决于每个图像的特征向量数量)。

【讨论】:

【参考方案2】:

看看这个例子:https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/find_obj.cpp?rev=2065

【讨论】:

code.opencv.org/projects/opencv/repository/entry/trunk/opencv/… 第二个提供的链接也不加载(不再)

以上是关于将一个图像中的 SURF 描述符与其他图像中的描述符列表进行比较的主要内容,如果未能解决你的问题,请参考以下文章

C++/SIFT/SQL - 如果有办法有效地将图像的 SIFT 描述符与 SQL 数据库中的 SIFT 描述符进行比较?

使用 OpenCV 描述符与 findFundamentalMat 匹配

如何将 SURF 兴趣点与图像数据库匹配

OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB

SIFT/SURF

EMGU CV SURF 图像匹配