|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
10.07.2017, 17:27 | #1 |
Новичок
Джуниор
Регистрация: 10.07.2017
Сообщений: 1
|
кластеризация k-means OpenCV
Здравствуйте, есть код кластеризации точек на плоскости алгоритмом k-means, в котором точки на изображение выводятся рандомно, а нужно через switch сделать, чтоб выводились либо рандомно, либо вручную создавать. Никак не понимаю как это осуществить, помогите пожалуйста
#include "opencv2/highgui/highgui.hpp" #include "opencv2/core/core.hpp" #include "opencv2/imgproc.hpp" #include <iostream> using namespace cv; using namespace std; int main( int argc, char** argv ) { const int MAX_CLUSTERS = 5; Scalar colorTab[] = { Scalar(0, 0, 255), Scalar(0,255,0), Scalar(255,100,100), Scalar(255,0,255), Scalar(0,255,255) }; Mat img(500, 500, CV_8UC3); RNG rng(12345); for(;; ) { int k, clusterCount = rng.uniform(2, MAX_CLUSTERS+1); int i, sampleCount = rng.uniform(1, 1001); Mat points(sampleCount, 1, CV_32FC2), labels; clusterCount = MIN(clusterCount, sampleCount); Mat centers(clusterCount, 1, points.type()); /* генерируются случайные значения СС использованием нормального распределения*/ for( k = 0; k < clusterCount; k++ ) { Point center; center.x = rng.uniform(0, img.cols); center.y = rng.uniform(0, img.rows); Mat pointChunk = points.rowRange(k*sampleCount/clusterCount, k == clusterCount - 1 ? sampleCount : (k+1)*sampleCount/clusterCount); rng.fill(pointChunk, CV_RAND_NORMAL, Scalar(center.x, center.y), Scalar(img.cols*0.05, img.rows*0.05)); } /* перетасовывает элементы случайным образом */ randShuffle(points, 1, &rng); /* вызов алгоритма k-средних */ kmeans(points, clusterCount, labels, TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0), 3, KMEANS_PP_CENTERS, сenters); /* очистка изображения */ img = Scalar::all(0); /* вывод точек на изображение*/ for( i = 0; i < sampleCount; i++ ) { int clusterIdx = labels.at<int>(i); Point ipt = points.at<Point2f>(i); circle( img, ipt, 2, colorTab[clusterIdx], CV_FILLED, CV_AA ); } /* вывод на экран*/ imshow("clusters", img); /* завершение работы или генерация по новой*/ char key = (char)waitKey(); if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC' break; } return 0; } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Нечёткая кластеризация методом c-means | Smitt&Wesson | C++ Builder | 34 | 30.10.2015 06:20 |
кластеризация | Настюн | Помощь студентам | 9 | 28.02.2015 02:45 |
Помощь с реализовать алгоритма к-means( к-средних) в С++ или паскале. | sergeyi_m | Помощь студентам | 0 | 26.04.2014 00:45 |