2011-03-28 72 views
2

我试图聚集一组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,并且感到非常困惑! 再次感谢!

+1

值得注意的是'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

回答

1

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

+0

感谢您的回复:)创建'KMeansIndexParams'对象解决了这个问题,但是现在我又有了另外一个 - 它说所需簇的数量必须至少为1个。我认为算法应该确定所需簇的数量? – n00dle 2011-03-31 10:28:07

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));