繁体   English   中英

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

[英]C++/SIFT/SQL - If there a way to compare efficiently a SIFT descriptor of an image with a SIFT descriptor in a SQL database?

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

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

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

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

如果有另一种方法来做那些东西? 我知道在SQL数据库中,当您使用“SELECT a FROM b WHERE ...”之类的内容时,请求会很有效。

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

我已经阅读过这篇文章: 比较存储在mysql数据库中的SIFT功能,但它对我没有帮助。 谢谢。

如果我是你,我宁愿比较代码中的描述符,而不是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; 它解决了手动解析描述符值的麻烦。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM