//OpenCV #include #include "progress_thread.h" /// Calculates the squared Euclidean distance between two vectors template T l2_norm_sq(T* v, size_t len){ T sq_sum = 0; //initialize the squared sum to zero for(size_t i = 0; i < len; i++) //for each element of the vectors sq_sum += pow(v[i], 2); //multiply the components return sq_sum; //return the square root of the squared sum } template T euclidean_dist_sq(T* v0, T* v1, size_t len){ T* diff = (T*)malloc(sizeof(T) * len); //allocate space for the difference vector for(size_t i = 0; i < len; i++) diff[i] = v1[i] - v0[i]; return l2_norm_sq(diff, len); } void train_kmeans(cv::Mat ¢ers, cv::Mat &F, int k, int attempts, int iters, double epsilon){ cv::Mat labels; cv::kmeans(F, k, labels, cv::TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, iters, epsilon), attempts, cv::KMEANS_PP_CENTERS, centers); int* nk = (int*) malloc(sizeof(int) * k); //create an array to store the number of pixels for each cluster memset(nk, 0, sizeof(int) * k); std::cout<<"size: "<(n, 0)]++; for(int n = 0; n < k; n++) //for each cluster std::cout<<"cluster "<