C ++ / SIFT / SQL - 如果有一种方法可以有效地比较图像的SIFT描述符和SQL数据库中的SIFT描述符?

时间:2014-08-04 13:58:41

标签: c++ mysql sql-server opencv sift

我想找到一种方法,可以将图像(查询)的SIFT描述符与包含大量不同图片描述符的SQL数据库中的描述符进行比较。

实际上,我的最终目的是做一个应用程序,它允许将一张图片与数据库中的大量图片(不在我的设备中)进行比较,而是在SQL数据库中进行比较。

我认为首先要在SQL数据库中存储每个描述符,并使用Brute Force方法或FlanneBased方法将每个描述符与另一个描述符进行比较。问题是,在SQL数据库中,由于匹配背后的“数学”(欧几里德距离,例如sqrt(a²+b²+ ...)),计算匹配需要很长时间,而且不可能在庞大的数据库中进行这种比较。

例如,如果我没有弄错,SIFT描述符包含128个数字,所以想象一下将每个描述符的每个数字进行比较的时间。

如果还有其他方法可以做到这一点?我知道在SQL数据库中,当你使用“SELECT a FROM b WHERE ...”这样的东西时,请求是有效的

因此我想知道是否有办法以有效的方式存储SIFT描述符?例如,我想把“加密”描述符变成一种大的字符串链,每个链都是唯一的,因此我可以将它们进行比较,但我不知道它是否是一个很好的解决方案。

我已经阅读过这篇文章:Comparing SIFT features stored in a mysql database但它对我没有帮助。 谢谢。

2 个答案:

答案 0 :(得分:1)

如果我是你,我宁愿比较代码中的描述符,而不是SQL。 SQL不适用于此。我会做以下事情: -

1. Pre-load N descriptors from SQL onto memory.
2. Compare distances to query descriptor, descriptor by descriptor.
3. If distance<threshold, push to possiblematches.
4. When you reach N/2 descriptors, push the next N.
5. Compare all matches, choose the best one or the best D descriptors, as per your requirement.

然而,为此,我宁愿使用OpenCV内置的FileStorage类,它提供XML和YAML文件的I / O;它解决了手动解析描述符值的麻烦。

答案 1 :(得分:0)

使用SQL数据库比较SIFT并不是最佳选择。 OpenCV提出了更高效的some keypoint matchers。您可以在 ./ samples / cpp / matcher_simple.cpp 中找到一个示例,其中SURF描述符很容易适应SIFT。基本上,核心是

BFMatcher matcher(NORM_L2);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);

据我记忆,一些匹配器(例如Flann)仅适用于某种类型的描述符(CV_32F)。