首页 文章

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

提问于
浏览
4

我想找到一种方法,可以将图像(查询)的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 回答

  • 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;它解决了手动解析描述符值的麻烦 .

  • 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) .

相关问题