2011-03-28 70 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));