const vector<double> histogram2d::get_bin_centres_y() { const double step = get_step_y(); vector<double> centres(bins_y); for (int i = 0; i < bins_y; i++) centres(i) = min_y + i * step + step / 2; return centres; }
Foam::pointField Foam::treeDataTriSurface::shapePoints() const { const pointField& points = surface_.points(); pointField centres(surface_.size()); forAll(surface_, triI) { centres[triI] = surface_[triI].centre(points); }
float pupiltracker::cvx::histKmeans(const cv::Mat_<float>& hist, int bin_min, int bin_max, int K, float init_centres[], cv::Mat_<uchar>& labels, cv::TermCriteria termCriteria) { CV_Assert( hist.rows == 1 || hist.cols == 1 && K > 0 ); labels = cv::Mat_<uchar>::zeros(hist.size()); int nbins = hist.total(); float binWidth = (bin_max - bin_min)/nbins; float binStart = bin_min + binWidth/2; cv::Mat_<float> centres(K, 1, init_centres, 4); int iters = 0; bool finalRun = false; while (true) { ++iters; cv::Mat_<float> old_centres = centres.clone(); int i_bin; cv::Mat_<float>::const_iterator i_hist; cv::Mat_<uchar>::iterator i_labels; cv::Mat_<float>::iterator i_centres; uchar label; float sumDist = 0; int movedCount = 0; // Step 1. Assign each element a label for (i_bin = 0, i_labels = labels.begin(), i_hist = hist.begin(); i_bin < nbins; ++i_bin, ++i_labels, ++i_hist) { float bin_val = binStart + i_bin*binWidth; float minDist = sq(bin_val - centres(*i_labels)); int curLabel = *i_labels; for (label = 0; label < K; ++label) { float dist = sq(bin_val - centres(label)); if (dist < minDist) { minDist = dist; *i_labels = label; } } if (*i_labels != curLabel) movedCount++; sumDist += (*i_hist) * std::sqrt(minDist); } if (finalRun) return sumDist; // Step 2. Recalculate centres cv::Mat_<float> counts(K, 1, 0.0f); for (i_bin = 0, i_labels = labels.begin(), i_hist = hist.begin(); i_bin < nbins; ++i_bin, ++i_labels, ++i_hist) { float bin_val = binStart + i_bin*binWidth; centres(*i_labels) += (*i_hist) * bin_val; counts(*i_labels) += *i_hist; } for (label = 0; label < K; ++label) { if (counts(label) == 0) return std::numeric_limits<float>::infinity(); centres(label) /= counts(label); } // Step 3. Detect termination criteria if (movedCount == 0) finalRun = true; else if (termCriteria.type | cv::TermCriteria::COUNT && iters >= termCriteria.maxCount) finalRun = true; else if (termCriteria.type | cv::TermCriteria::EPS) { float max_movement = 0; for (label = 0; label < K; ++label) { max_movement = std::max(max_movement, sq(centres(label) - old_centres(label))); } if (sqrt(max_movement) < termCriteria.epsilon) finalRun = true; } } return std::numeric_limits<float>::infinity(); }