不知道“k”的OpenCV中的分层k-Means

时间:2011-03-28 15:33:00

标签: c++ opencv cluster-analysis k-means

我正在尝试聚类一组4D向量,而不知道应该提前有多少个聚类。在过去,我已经能够使用cvKmeans2进行聚类,因为他们知道了聚类的数量。我正在浏览API并遇到cv::flann::hierarchicalClustering。看起来它会做我需要的东西(即,执行k-means,在必要时拆分簇,迭代直到拆分使结果恶化),但我真的在努力处理“索引参数”。

我已经想出我需要创建一个index structure作为第二个参数,但我从以下代码中收到错误:

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,我很困惑! 再次感谢!

2 个答案:

答案 0 :(得分:2)

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

所需的簇计数由centers.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));

答案 1 :(得分:1)

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