我试图聚集一组4D向量,而不知道应该提前多少个簇。在过去,我已经能够使用cvKmeans2进行聚类,只要知道聚类的数量。我正在浏览API,并遇到了cv::flann::hierarchicalClustering
。这看起来像它会做我所需要的(即,执行k-means,在必要时拆分集群,迭代直到分裂会恶化结果),但我真的在努力处理“索引参数”。OpenCV中不知道“k”的分层k均值
我已经想通了,我需要创建一个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++知识很好,但不是很好)。我想我已经发布了所有相关的代码,但如果没有,请告诉我,我会发布更多。
在此先感谢!
UPDATE
我已经按照LumpN的意见,并创造了K均值对象,使用下列内容:
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,并且感到非常困惑! 再次感谢!
值得注意的是'cvflann :: HierarchicalClusteringIndex'类似k-means但不是。 Muja&Lowe使用层次聚类树的森林实现了二进制特征的快速匹配(http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=6233169)。它不是k-均值,因为没有像k均值那样尝试减少总体失真的迭代步骤,即点到其聚类中心的距离的平方和,并且它从数据中选择聚类中心而不是平均值。 – gantzer89 2014-01-21 21:56:30