Иерархические k-средства в OpenCV без знания «k» - PullRequest
2 голосов
/ 28 марта 2011

Я пытаюсь сгруппировать набор четырехмерных векторов, не зная, сколько кластеров должно быть заранее. В прошлом я мог использовать cvKmeans2 для кластеризации, учитывая количество кластеров. Я рылся в API и наткнулся на cv::flann::hierarchicalClustering. Похоже, что он будет делать то, что мне нужно (а именно: выполнять k-средства, разделять кластеры, где это необходимо, выполнять итерацию до тех пор, пока разделение не ухудшит результат), но я действительно борюсь с «параметрами индекса».

Я понял, что мне нужно создать структуру индекса , которая входит в качестве второго параметра, но я получаю сообщение об ошибке из следующего кода:

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 и создал объект 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 и полностью сбит с толку! Еще раз спасибо!

Ответы [ 2 ]

2 голосов
/ 15 декабря 2012

"количество требуемых кластеров должно быть не менее 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));
1 голос
/ 28 марта 2011

Вы должны передать ссылку на createIndex, то есть createIndex(*framePoints) (обратите внимание на звездочку!).Другая ошибка может быть createIndex, являющейся нестатической (членской) функцией.В этом случае вам нужно будет создать KMeansIndexParams объект и вызвать createIndex для этого.

...