Привет, с opencv c ++, я хочу сделать кластеризацию, чтобы классифицировать связанные компоненты на основе площади и высоты.
Я понимаю концепцию кластеризации, но мне сложно реализовать ее в opencv c ++.
В opencv
http://docs.opencv.org/modules/core/doc/clustering.html
Есть методы кластеризации kmeans
Большинство сайтов, которые я искал, они просто объясняют концепцию и параметры функции kmeans в opencv c ++, и большинство из них были скопированы с сайта документа opencv.
double kmeans(InputArray data, int K, InputOutputArray bestLabels, TermCriteria criteria, int attempts, int flags, OutputArray centers=noArray() )
Здесь также есть хороший пример, но он был реализован на Python
Как я упоминал выше, у меня есть все подключенные компоненты, и я могу рассчитать площади и высоту каждого подключенного компонента.
Я хочу использовать кластеризацию, чтобы различать подключенные компоненты.
Например, с методами k-средних я бы использовал k = 2.
Поблагодарить..
Я публикую фрагмент, надеюсь, это поможет вам ….
Высота и площадь компонента могут использоваться как функция для kmean. Теперь здесь для каждой функции Kmean даст вам центр. то есть 1 центр для области и 1 центр для высоты компонента.
Mat labels;
int attempts = 11;
Mat centers;
int no_of_features = 2;//(i.e. height, area)
Mat samples(no_of_connected_components, no_of_features, CV_32F);
int no_of_sub_classes = 1; // vary for more sub classes
for (int j = 0; j < no_of_connected_components; j++)
{
for (int x = 0; x < no_of_features; x++)
{
samples.at<float>(j, x) = connected_component_values[j,x];
//fill the values(height, area) of connected component labelling
}
}
cv::kmeans(samples, no_of_sub_classes, labels, TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 10000, 0.001), attempts, KMEANS_PP_CENTERS, centers);
for (size_t si_i = 0; si_i < no_of_sub_classes ; si_i++)
{
for (size_t si_j = 0; si_j < no_of_features; si_j++)
{
KmeanTable[si_i*no_of_sub_classes + si_i][si_j] = centers.at<float>(si_i, si_j);
}
}
Здесь я храню центр в 2D-массиве kmeanTable, который вы можете использовать своим. Теперь для каждого подключенного компонента вы можете рассчитать евклидово расстояние от центров.
Нижние отличия признаются для классификации.
Проверьте этот из.
За исключением того, что вместо итерации по x, y и z вы будете итерировать по компоненту и свойству (площадь и высота).