Как использовать кластеризацию с opencv c ++ для классификации подключенного компонента по площади и высоте

Привет, с 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

http://docs.opencv.org/trunk/doc/py_tutorials/py_ml/py_kmeans/py_kmeans_opencv/py_kmeans_opencv.html?highlight=kmeans

Как я упоминал выше, у меня есть все подключенные компоненты, и я могу рассчитать площади и высоту каждого подключенного компонента.

Я хочу использовать кластеризацию, чтобы различать подключенные компоненты.

Например, с методами k-средних я бы использовал k = 2.

Поблагодарить..

1

Решение

Я публикую фрагмент, надеюсь, это поможет вам ….
Высота и площадь компонента могут использоваться как функция для 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, который вы можете использовать своим. Теперь для каждого подключенного компонента вы можете рассчитать евклидово расстояние от центров.
Нижние отличия признаются для классификации.

2

Другие решения

Проверьте этот из.

За исключением того, что вместо итерации по x, y и z вы будете итерировать по компоненту и свойству (площадь и высота).

0

По вопросам рекламы [email protected]