我正在尝试聚类一组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,我很困惑!
再次感谢!
答案 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
。