2015-11-03 69 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);