2014-02-27 62 views

回答

1

要羣集,轉換N * 128維(N是描述符的從每個圖像的數目)成M * 128維數組(所有圖像中M個描述符)。並對這些數據執行集羣。

如:

def dict2numpy(dict): 
    nkeys = len(dict) 
    array = zeros((nkeys * PRE_ALLOCATION_BUFFER, 128)) 
    pivot = 0 
    for key in dict.keys(): 
     value = dict[key] 
     nelements = value.shape[0] 
     while pivot + nelements > array.shape[0]: 
      padding = zeros_like(array) 
      array = vstack((array, padding)) 
     array[pivot:pivot + nelements] = value 
     pivot += nelements 
    array = resize(array, (pivot, 128)) 
    return array 

all_features_array = dict2numpy(all_features) 
nfeatures = all_features_array.shape[0] 
nclusters = 100 
codebook, distortion = vq.kmeans(all_features_array, 
             nclusters) 
-1

通常使用kmeans來獲得k箇中心,您可以將每個圖像更改爲K的向量(每個維度表示該羣集中有多少個補丁)。

2

方法:所有的

  • 首先計算SIFT descriptor對於每個圖像/對象,然後push_back該描述符成單個圖像(稱爲讓該圖像Mat featuresUnclustered)。

  • 之後,您的任務是將所有描述符聚類到一定數量的組/簇(由您決定)。這將是你的詞彙量/詞典的大小。

    int dictionarySize=200;

  • 然後終於來聚類他們的步驟

    //define Term Criteria 
    TermCriteria tc(CV_TERMCRIT_ITER,100,0.001); 
    
    //retries number 
    int retries=1; 
    
    //necessary flags 
    int flags=KMEANS_PP_CENTERS; 
    
    //Create the BoW (or BoF) trainer 
    BOWKMeansTrainer bowTrainer(dictionarySize,tc,retries,flags); 
    
    //cluster the feature vectors 
    Mat dictionary=bowTrainer.cluster(featuresUnclustered);  
    
+0

確定,怎麼能代表描述符的聚類,我知道描述符128的功能。所以如何表示它們 –

+0

對於一個對象/圖像,您將得到一個描述符,它只是一行128列的圖像。因此,如果您使用50張圖像,那麼您將擁有50張這樣的圖像(即一行128列)。現在,您將所有這些行放在一個單個圖像中,在上面的示例中,這些圖像的特徵爲「unclustered」。 – skm