2013-07-27 64 views
0

我試圖實現Scalable Recognition with a Vocabulary Tree ,我使用opencv kmeans函數來聚類特徵向量,所以我把我的所有向量放在一個Mat對象中,並將它傳遞給像這樣的函數:opencv kmeans不分類數據在某些類

TermCriteria criteria; 
criteria.epsilon = 0.1; 
int attempts = 1; 
int flags = KMEANS_RANDOM_CENTERS; 
int K = 10; 
Mat Centers; 
Mat Labels; 

kmeans(descriptors, K, Labels, criteria, attempts, flags, Centers); 

所以在函數填充「中心」和「標籤」墊對象是這樣的:

Centers has K rows, 64 columns (I'm using SURF features) and one channel 

Labels has as many rows as "descriptors", one column and one channel and it's values are in the range of [0 K-1] 

這些都是我檢查了的東西。在對所有向量執行此操作之後,我將具有相同標籤的向量複製到一個新的Mat中,並再次將其傳遞給該函數。

我的問題是,有時在「標籤」中缺少範圍[0 k-1]中的一個值,因此沒有特徵向量被分類到該羣集中。我已經檢查過不同的K,它通常會在某個級別發生至少一次(儘管在第一次調用中從來不會發生)。即使對於K = 3.

我假設在那些時候我傳遞給函數的數據是不正確的。所以我的問題是,這是什麼時候發生的?我應該檢查哪些數據傳遞給函數以確保它們是有效的?

此外,如果你有一個任何好的文章實現的鏈接,我真的很感激它,如果你在這裏發佈它。

回答

0

事實證明,有些時候一些集羣中有少於K個的成員,所以在下一個層次中該函數返回一個錯誤。儘管我仍然沒有弄清楚爲什麼有時候一個集羣是空的。