OpenCV Kmeans кластеризация нескольких матов

Этот вопрос специфичен для opencv (c ++). Я хотел объединить несколько матриц / изображений вместе, чтобы создать один ряд центров кластеров и получить меру соответствия.

Я в настоящее время использую BOWTrainer класс, используя метод .add для добавления матов, а затем метод .cluster для генерации центров. Тем не менее, он не выводит метрику, описывающую степень соответствия. Я знаю ваниль kmeans функция возвращает показатель компактности, но я не смог найти способ сгруппировать несколько различных матов с этим, это возможно?

0

Решение

Как вы можете видеть в 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 );
1

Другие решения

Других решений пока нет …