2

我正在尝试对一组 4D 向量进行聚类,但事先不知道应该有多少个聚类。在过去,我已经能够使用 cvKmeans2 进行聚类,只要知道聚类的数量。我正在浏览 API 并遇到cv::flann::hierarchicalClustering. 这看起来会做我需要的(即,执行k-means,在必要时拆分集群,迭代直到拆分使结果恶化),但我真的在“索引参数”上苦苦挣扎。

我发现我需要创建一个作为第二个参数的索引结构,但是我从以下代码中得到一个错误:

cv::flann::Index fln_idx = cv::flann::KMeansIndexParams::createIndex( framePoints );

错误是:

../src/segmentation_1.cpp:592: error: cannot call member function ‘virtual flann::Index* cv::flann::KMeansIndexParams::createIndex(const cv::Mat&) const’ without object

framePoints定义如下:

CvMat *framePoints = cvCreateMat( frameTracklets.size( ), 4, CV_32FC1 );

我很确定我在做一些非常愚蠢的事情(我的 C++ 知识还可以,但不是很好)。我想我已经发布了所有相关的代码,但如果没有,请告诉我,我会发布更多。

提前致谢!

更新

我遵循了 LumpN 的建议并使用以下内容创建了一个 Kmeans 对象:

cv::Mat centres;
cv::flann::KMeansIndexParams fln_idx = cv::flann::KMeansIndexParams();
fln_idx.createIndex( framePoints );

int numClust;
numClust = hierarchicalClustering(framePoints, centres, fln_idx);

现在,当我运行它时,我收到一条错误消息,hierarchicalClustering()例如“所需集群的数量应该是>= 1”(我需要检查何时开始工作 - 我将使用实际错误进行更新)。我假设它createIndex()给出了起点,然后hierarchicalClustering()拆分集群直到找到一个好的结果(不确定这是否是最佳的)。我需要cv::flann::KMeansIndexParams()用一些参数打电话吗?我看过api,完全糊涂了!再次感谢!

4

2 回答 2

2

“所需集群的数量必须至少为 1”。

所需的集群计数由 center.rows 确定。所以你必须先调整中心的大小。例如:

Mat centers (clusterCount,DESCRIPTOR_SIZE,cv_32FC1);
int count = cv::flann::hierarchicalClustering<cvflann::L2<float> >(descriptors,centers,cvflann::KMeansIndexParams(32,11,cvflann::FLANN_CENTERS_KMEANSPP));
于 2012-12-15T13:18:02.107 回答
1

您必须传递对createIndex,的引用createIndex(*framePoints)(请注意星号!)。另一个错误可能createIndex是非静态(成员)函数。在这种情况下,您必须创建一个KMeansIndexParams对象并调用createIndex它。

于 2011-03-28T16:58:47.927 回答