2

事前にクラスターの数を知らずに、4Dベクトルのセットをクラスター化しようとしています。過去には、クラスターの数に関する知識があれば、cvKmeans2を使用してクラスター化することができました。私はAPIをトロールしていて、に出くわしcv::flann::hierarchicalClusteringました。これは必要なことを実行するように見えます(つまり、k-meansを実行し、必要に応じてクラスターを分割し、分割によって結果が悪化するまで繰り返します)が、「インデックスパラメーター」に本当に苦労しています。

2番目のパラメーターとして入力するインデックス構造を作成する必要があることがわかりましたが、次のコードからエラーが発生します。

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を見て、完全に混乱しています!再度、感謝します!

4

2 に答える 2

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));
于 2012-12-15T13:18:02.107 に答える
1

への参照を渡す必要があります。createIndexつまり、createIndex(*framePoints)(アスタリスクに注意してください!)。別のエラーはcreateIndex、非静的 (メンバー) 関数である可能性があります。その場合、KMeansIndexParamsオブジェクトを作成しcreateIndexてそれを呼び出す必要があります。

于 2011-03-28T16:58:47.927 に答える