LSH与二进制字符串一起使用,在索引和检索方面非常有效。虽然SIFT不是二进制描述符,但它仍然是那里可用的最佳描述符。是否可以将SIFT与LSH一起使用?此外,是否有更好的索引技术可用于SIFT功能?
我尝试在OpenCV中使用带有FLANNBased Matcher和LSH的SIFT,但得到以下错误:
what():C:\ OpenCV \ opencv \ modules \ flann \ src \ miniflann.cpp:315:错误: 函数buildIndex _
中的(-210)type = 5
代码:
cv::Ptr<cv::FlannBasedMatcher> matcher = new cv::FlannBasedMatcher(new cv::flann::LshIndexParams(5, 24, 2));
matcher->match( descriptors, descriptors1, matches );
注意:这个问题在dsp.stackexchange.com上更为贴切,但它现在处于只读模式。
答案 0 :(得分:3)
LSH是降维的算法,输出二进制字符串。它被设计用于使用二进制代码来索引具有固有的低维度数据(但具有固有的较低维度,例如流形)。
您可以尝试自己实现LSH,以便它可以使用SIFT描述符。这种天真和最简单的方法是使用随机投影,但是使用SIFT描述符是梯度方向直方图的集合这一事实的一些更聪明的方案可能被利用来产生更有效的哈希函数。
答案 1 :(得分:3)
用于SIFT的两种最佳索引技术是kd-tree and k-means,请尝试使用它们。 它们都在FLANN matcher which is part of OpenCV中实现。 这两篇论文比较了SLAN的FLANN和LSH:
&#34; Locality sensitive hashing: a comparison of hash function types and querying mechanisms&#34;
&#34; How to Use SIFT Vectors to Analyze an Image with Database Templates&#34;
实际上,Alexandr Andoni已经实现了something very similar你想要的东西。