2011-04-29 31 views
3

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

谢谢, 洛基。

回答

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/

祝你好运!

1

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

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

至于实施,cv::BOWTrainer来自OpenCV的是一个很好的起点,但也没有很好的概括为一个层次的BoW方案的情况下,因为它规定的中心存储在一个简单的cv::Mat而词汇树通常是不平衡的,从内存使用的角度将其映射到矩阵可能不是有效的,因为当节点数量远远低于平衡树中理论数量的节点时,其深度为L和分支因子k,即:

n << (1-k^L)/(1-k)

0

Che在src/vocab_tree/clustering。*中找到libvot中的代码,您可以找到聚类算法的详细实现。