0
這個問題是特定於opencv(C++)。我正在尋找將多個Matricies /圖像聚類在一起以創建一排聚類中心並獲得適合度量。opencv kmeans聚簇多個墊子
我目前使用BOWTrainer類,使用.add方法添加地墊,然後使用.cluster方法生成中心。然而,它不會輸出一個度量來描述擬合的緊密程度。我知道香草kmeans函數返回一個緊湊度量,但我還沒有找到一種方法來聚集多個不同的墊子,這是可能的嗎?
這個問題是特定於opencv(C++)。我正在尋找將多個Matricies /圖像聚類在一起以創建一排聚類中心並獲得適合度量。opencv kmeans聚簇多個墊子
我目前使用BOWTrainer類,使用.add方法添加地墊,然後使用.cluster方法生成中心。然而,它不會輸出一個度量來描述擬合的緊密程度。我知道香草kmeans函數返回一個緊湊度量,但我還沒有找到一種方法來聚集多個不同的墊子,這是可能的嗎?
正如您在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);