2015-11-03 73 views
0

這個問題是特定於opencv(C++)。我正在尋找將多個Matricies /圖像聚類在一起以創建一排聚類中心並獲得適合度量。opencv kmeans聚簇多個墊子

我目前使用BOWTrainer類,使用.add方法添加地墊,然後使用.cluster方法生成中心。然而,它不會輸出一個度量來描述擬合的緊密程度。我知道香草kmeans函數返回一個緊湊度量,但我還沒有找到一種方法來聚集多個不同的墊子,這是可能的嗎?

回答

1

正如您在bagofwords.cpp,kmeans中看到的那樣,緻密度測量不存儲在BOWTrainer中。

Mat BOWKMeansTrainer::cluster(const Mat& _descriptors) const 
{ 
    Mat labels, vocabulary; 
    kmeans(_descriptors, clusterCount, labels, termcrit, attempts, flags, vocabulary); 
    return vocabulary; 
} 

所以你不能直接從BOWKMeansTrainer檢索該值。


你可以,但是,執行相同的操作BOWKMeansTrainer::cluster()和檢索的緊湊措施:

// int clusterCount = ... 
// TermCriteria termcrit = ... 
// int attempts = ... 
// int flags = ... 

// Create trainer 
BOWKMeansTrainer bow(clusterCount, termcrit, attempts, flags); 

// Add some descriptors 
// bow.add(...); 

// Retrieve descriptors 
vector<Mat> descriptors = bow.getDescriptors(); 

// Check that !descriptors.empty() 

// Form a single descriptor matrix (as in "Mat BOWKMeansTrainer::cluster() const") 

int descCount = 0; 
for(size_t i = 0; i < descriptors.size(); i++) 
    descCount += descriptors[i].rows; 

Mat mergedDescriptors(descCount, descriptors[0].cols, descriptors[0].type()); 
for(size_t i = 0, start = 0; i < descriptors.size(); i++) 
{ 
    Mat submut = mergedDescriptors.rowRange((int)start, (int)(start + descriptors[i].rows)); 
    descriptors[i].copyTo(submut); 
    start += descriptors[i].rows; 
} 

// Perform cluster (as in "Mat BOWKMeansTrainer::cluster(const Mat& _descriptors) const") 

Mat labels, vocabulary; 
double compactness = kmeans(mergedDescriptors, clusterCount, labels, termcrit, attempts, flags, vocabulary);