在OpenCV中实现词汇树

时间:2011-04-29 22:17:03

标签: opencv k-means image-recognition feature-detection

我正在尝试基于纸张“用词汇树进行可扩展识别”来实现图像搜索。我正在使用SURF来提取功能和关键点。例如,对于图像,我要说300个关键点,每个关键点有128个描述符值。我的问题是如何在数据上应用K-Means聚类算法。我的意思是我是否需要在所有点上应用聚类算法,即300 * 128值或者我是否需要找到连续描述符值之间的距离并存储值并对其应用聚类算法。我很困惑,任何帮助都将不胜感激。

谢谢, 落基

3 个答案:

答案 0 :(得分:1)

从你的问题我会说你很困惑。词汇树技术基于k-means层次聚类和叶节点的TF-IDF加权方案。

简而言之,用于词汇树构造的聚类算法在所有d-dimensional数据(对于SIFT的情况d=128)上运行k-means一次,然后在每个数据上再次运行k-means所获得的簇直到某个深度水平。因此,词汇树构造的两个主要参数是分支因子k和树深度L。一些改进只考虑分支因子,而深度是通过切割树来自动确定的,以实现最小方差测量。

至于实现,来自OpenCV的cv::BOWTrainer是一个很好的起点,虽然对于分层BoW方案的情况并不是很普遍,因为它强制将中心存储在一个简单的cv::Mat中虽然词汇树通常是不平衡的,并且当节点数远远低于具有深度的平衡树中的理论节点数时,从存储器使用的角度来看,以水平方式将其映射到矩阵可能效率不高。 {1}}和分支因子L,即:

k

答案 1 :(得分:0)

据我所知,我认为您必须将所有描述符存储在cv :: Mat上,然后将其添加到“Kmeans Trainer”中,这样​​您最终可以应用聚类算法。这里有一个片段,可以让您了解我在说什么:

BOWKMeansTrainer bowtrainer(1000); //num clusters
bowtrainer.add(training_descriptors); // we add the descriptors
Mat vocabulary = bowtrainer.cluster(); // apply the clustering algorithm

这可能对你很有意思:http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w-code/

祝你好运!!

答案 2 :(得分:0)

查看libvot中的代码,在src / vocab_tree / clustering。*中,您可以找到群集算法的详细实现。