1

Привет, с opencv C++, я хочу сделать кластеризацию для классификации связанных компонентов на основе области и высоты. Я понимаю концепцию кластеризации, но мне трудно выполнить ее в opencv C++.Как использовать кластеризацию с opencv C++ для классификации подключенного компонента на основе области и высоты

В OpenCV

http://docs.opencv.org/modules/core/doc/clustering.html

Существует кластеризация методы kmeans

Большая часть веб-сайта я искал, они просто объяснить понятие и параметры функции kmeans в OpenCV C++ и большинство они были скопированы с сайта opencv document.

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

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

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

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

Спасибо ..

+0

взгляните на [grouprectangles] (http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html#grouprectangles) – berak

ответ

0

Проверить this вне.

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

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); 
    } 

} 

Здесь я размещаю центр в kmeanTable 2D массиве, который вы можете использовать. Теперь для каждого подключенного компонента вы можете вычислить эвклидовое расстояние от центров. Более низкие отличительные признаки относятся к классификации.