我目前正在扩展一个用于对图像进行分类的图像库,并且我想查找重复图像、转换图像以及包含或包含在其他图像中的图像。
我已经测试了 OpenCV 的 SIFT 实现,它工作得很好,但对于多个图像来说会相当慢。太快了,我想我可以提取特征并将它们保存在数据库中,因为许多其他与图像相关的元数据已经保存在那里。
将新图像的特征与数据库中的特征进行比较的最快方法是什么?
通常比较是使用 kd-trees、FLANN 或我在 SO 上的另一个线程中找到的Pyramid Match Kernel来计算欧几里得距离,但还没有深入研究。
由于我不知道如何有效地在数据库中保存和搜索 kd-tree,因此我目前只看到三个选项:
* 让 MySQL 计算到数据库中每个特征的欧几里德距离,尽管我很确定这将花费不合理的时间来处理多个图像。
* 在开始时将整个数据集加载到内存中并构建 kd-tree(s)。这可能会很快,但非常占用内存。另外,所有数据都需要从数据库中传输。
* 将生成的树保存到数据库中并加载所有这些树,这将是最快的方法,但也会产生大量流量,因为对于新图像,kd-trees 必须重建并发送到服务器。
我正在使用 OpenCV 的 SIFT 实现,但我并没有死心塌地。如果有一个更适合这项任务的特征提取器(并且大致同样健壮),我很高兴有人能推荐一个。