use opencv::core;
use nalgebra::{DMatrix, DVector};
use crate::image::cvutils;
pub struct KMeans {
k : usize,
clust_ixs : DVector<i32>,
clust_centers : DMatrix<f32>,
max_iter : usize
}
impl KMeans {
pub fn new(k : usize, feature_sz : usize, max_iter : usize) -> Self {
let clust_centers = DMatrix::<f32>::zeros(k, feature_sz);
let clust_ixs = DVector::<i32>::zeros(1);
Self { k, clust_ixs, clust_centers, max_iter }
}
pub fn calculate(&mut self, obs : &DMatrix<f32>) -> &[i32] {
let n = obs.len();
if n > self.clust_ixs.len() {
self.clust_ixs = DVector::zeros(n);
}
let ty = 1; let term = core::TermCriteria {
typ : ty,
max_count : self.max_iter as i32,
epsilon : 1.0
};
let n_attempts = 1;
unsafe {
let obs = cvutils::dmatrix_to_mat(&obs);
let mut out_labels = cvutils::slice_to_mat(&self.clust_ixs.as_mut_slice()[0..n], 1, None);
let mut centers = cvutils::dmatrix_to_mat(&self.clust_centers);
core::kmeans(
&obs,
self.k as i32,
&mut out_labels,
term,
n_attempts,
core::KMEANS_USE_INITIAL_LABELS,
&mut centers
).unwrap();
}
&self.clust_ixs.as_slice()[0..n]
}
}