+class KMeansDistanceComputer
+{
+public:
+ KMeansDistanceComputer( double *_distances,
+ int *_labels,
+ const Mat& _data,
+ const Mat& _centers )
+ : distances(_distances),
+ labels(_labels),
+ data(_data),
+ centers(_centers)
+ {
+ CV_DbgAssert(centers.cols == data.cols);
+ }
+
+ void operator()( const BlockedRange& range ) const
+ {
+ const int begin = range.begin();
+ const int end = range.end();
+ const int K = centers.rows;
+ const int dims = centers.cols;
+
+ const float *sample;
+ for( int i = begin; i<end; ++i)
+ {
+ sample = data.ptr<float>(i);
+ int k_best = 0;
+ double min_dist = DBL_MAX;
+
+ for( int k = 0; k < K; k++ )
+ {
+ const float* center = centers.ptr<float>(k);
+ const double dist = normL2Sqr_(sample, center, dims);
+
+ if( min_dist > dist )
+ {
+ min_dist = dist;
+ k_best = k;
+ }
+ }
+
+ distances[i] = min_dist;
+ labels[i] = k_best;
+ }
+ }
+
+private:
+ double *distances;
+ int *labels;
+ const Mat& data;
+ const Mat& centers;
+};
+