package edu.harvard.mcb.leschziner.analyze; import java.io.Serializable; import com.googlecode.javacv.cpp.opencv_core; import com.googlecode.javacv.cpp.opencv_core.CvMat; import com.googlecode.javacv.cpp.opencv_core.CvRNG; import com.googlecode.javacv.cpp.opencv_core.CvTermCriteria; public class KMeansClusterer implements Serializable { public KMeansClusterer(int clusters, double epsilon, int iterations, int attempts) { this.iterations = iterations; this.attempts = attempts; this.epsilon = epsilon; this.clusters = clusters; } /** * */ private static final long serialVersionUID = 4280771652047557377L; private final int iterations; private final int attempts; private final double epsilon; private final int clusters; public Clusters cluster(CvMat data) { CvTermCriteria terminationCriteria = new CvTermCriteria(opencv_core.CV_TERMCRIT_EPS + opencv_core.CV_TERMCRIT_ITER, iterations, epsilon); CvMat clusterLabels = CvMat.create(data.rows(), 1, opencv_core.CV_32SC1); CvMat clusterCenters = CvMat.create(clusters, data.cols(), opencv_core.CV_32FC1); double[] compactness = new double[attempts]; // Run a clusterer on the eigenimages opencv_core.cvKMeans2(data, clusters, clusterLabels, terminationCriteria, attempts, new CvRNG(null), 0, clusterCenters, compactness); return new Clusters(clusterLabels, clusterCenters, compactness); } }