【发布时间】:2011-03-31 03:49:05
【问题描述】:
我目前正在扩展一个用于对图像进行分类的图像库,我想查找重复图像、转换后的图像以及包含或包含在其他图像中的图像。
我已经测试了 OpenCV 的 SIFT 实现,它工作得很好,但对于多个图像来说会相当慢。太快了,我想我可以提取特征并将它们保存在数据库中,因为许多其他与图像相关的元数据已经保存在那里。
将新图像的特征与数据库中的特征进行比较的最快方法是什么?
通常比较是使用 kd-trees、FLANN 或 Pyramid Match Kernel 来计算欧几里得距离,我在 SO 上的另一个线程中找到了,但还没有深入研究。
由于我不知道如何在数据库中有效地保存和搜索 kd-tree,因此我目前只看到三个选项:
* 让 MySQL 计算到数据库中每个特征的欧几里得距离,尽管我确信这将花费不合理的时间来处理多个图像。
* 在开始时将整个数据集加载到内存中并构建 kd-tree(s)。这可能会很快,但非常占用内存。此外,所有数据都需要从数据库中传输。
* 将生成的树保存到数据库中并加载所有树,这将是最快的方法,但也会产生大量流量,因为对于新图像,kd 树必须重新构建并发送到服务器。
我正在使用 OpenCV 的 SIFT 实现,但我并没有死心塌地。如果有更适合这项任务的特征提取器(并且大致同样强大),我很高兴有人能推荐一个。
【问题讨论】:
-
OpenCV 已经包含一个 SURF 实现以及用于匹配的 Kd-Trees(不再需要 SIFT)。并且:这与您的问题没有直接关系,但您可能需要首先考虑匹配直方图(或其他全局特征)。通过这种方式,您可以通过预先消除具有非常不同直方图的所有候选对象来大幅减少与缓慢的高维特征进行比较的图像对数量。
标签: c++ database algorithm computer-vision sift