2011-04-29 86 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中的代碼,您可以找到聚類算法的詳細實現。