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)。
- 使用VerQueryValue检索应用程序的文件描述
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- I2C 文件描述符上的 I2C 总线可写/可读标志
- 如何在 CompleteAsyncIO 中访问 IOMemoryBufferDescriptor,该描述符通过中断 EP
- 如何在动态创建的CMFCToolbar的工具提示中添加描述?
- 下面描述的概念如何在C++14中定义?
- 请描述一下在 c++ 中在此类中定义构造函数的方式?
- numpy.load 给出 ValueError: descr 不是有效的 dtype 描述符:
- 在 Direct3D 12 的描述符范围内设置多个描述符
- 默认安全描述符
- 许多文件描述符在调用sys_clone时
- openCV输出SIFT描述符的类型
- OpenCV SIFT描述符关键点半径
- c++ /SIFT/SQL -如果有一种方法可以有效地比较图像的SIFT描述符与SQL数据库中的SIFT描述符
- 如何使用SIFT特征/描述符作为SVM训练的输入
- 多图像实时SIFT描述符匹配c++ /OpenCV
- SIFT描述符维度