gpt4 book ai didi

c++ - opencv kmeans聚类多个Mats

转载 作者:行者123 更新时间:2023-11-28 05:59:46 36 4
gpt4 key购买 nike

此问题特定于 opencv(c++)。我希望将多个矩阵/图像聚类在一起以创建单行聚类中心并获得拟合度。

我目前正在使用 BOWTrainer类,使用 .add 方法添加垫子,然后使用 .cluster 方法生成中心。但是,它不会输出一个度量来描述拟合的紧密程度。我知道 Vanilla 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 );

关于c++ - opencv kmeans聚类多个Mats,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33501093/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com