我想找到一种方法,可以将图像(查询)的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 回答
如果我是你,我宁愿比较代码中的描述符,而不是SQL . SQL不适用于此 . 我会做以下事情: -
但是,为此,我宁愿使用OpenCV内置的FileStorage类,它为XML和YAML文件提供I / O;它解决了手动解析描述符值的麻烦 .
使用SQL数据库比较SIFT并不是最佳选择 . OpenCV提出了更有效的some keypoint matchers . 您可以在 ./samples/cpp/matcher_simple.cpp 中找到一个示例,其中SURF描述符很容易适应SIFT . 基本上,核心是
据我所知,一些匹配器(例如Flann)仅适用于某种类型的描述符(CV_32F) .