/// <summary> /// /// </summary> /// <param name="clusterCount"></param> /// <param name="termcrit"></param> /// <param name="attempts"></param> /// <param name="flags"></param> public BOWKMeansTrainer(int clusterCount, TermCriteria?termcrit = null, int attempts = 3, KMeansFlag flags = KMeansFlag.PpCenters) { var termCritValue = termcrit.GetValueOrDefault(new TermCriteria()); ptr = NativeMethods.features2d_BOWKMeansTrainer_new(clusterCount, termCritValue, attempts, (int)flags); }
/// <summary> /// ベクトル集合を,与えられたクラスタ数に分割する. /// 入力サンプルを各クラスタに分類するために cluster_count 個のクラスタの中心を求める k-means 法を実装する. /// 出力 labels(i) は,配列 samples のi番目の行のサンプルが属するクラスタのインデックスを表す. /// </summary> /// <param name="samples">浮動小数点型の入力サンプル行列.1行あたり一つのサンプル.</param> /// <param name="cluster_count">集合を分割するクラスタ数</param> /// <param name="labels">出力の整数ベクトル.すべてのサンプルについて,それぞれがどのクラスタに属しているかが保存されている.</param> /// <param name="termcrit">最大繰り返し数と(または),精度(1ループでの各クラスタ中心位置移動距離)の指定</param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="_centers"></param> /// <param name="compactness"></param> /// <returns></returns> #else /// <summary> /// Splits set of vectors by given number of clusters /// </summary> /// <param name="samples">Floating-point matrix of input samples, one row per sample. </param> /// <param name="cluster_count">Number of clusters to split the set by. </param> /// <param name="labels">Output integer vector storing cluster indices for every sample. </param> /// <param name="termcrit">Specifies maximum number of iterations and/or accuracy (distance the centers move by between the subsequent iterations). </param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="_centers"></param> /// <param name="compactness"></param> /// <returns></returns> #endif public static int KMeans2(CvArr samples, int cluster_count, CvArr labels, CvTermCriteria termcrit, int attemps, CvRNG rng, KMeansFlag flag, CvArr _centers, out double compactness) { if (samples == null) throw new ArgumentNullException("samples"); if (labels == null) throw new ArgumentNullException("labels"); if (rng == null) { rng = new CvRNG(); } IntPtr centersPtr = (_centers != null) ? _centers.CvPtr : IntPtr.Zero; UInt64 rngValue = rng.Seed; int result = CvInvoke.cvKMeans2(samples.CvPtr, cluster_count, labels.CvPtr, termcrit, attemps, ref rngValue, flag, centersPtr, out compactness); rng.Seed = rngValue; return result; }
/// <summary> /// ベクトル集合を,与えられたクラスタ数に分割する. /// 入力サンプルを各クラスタに分類するために cluster_count 個のクラスタの中心を求める k-means 法を実装する. /// 出力 labels(i) は,配列 samples のi番目の行のサンプルが属するクラスタのインデックスを表す. /// </summary> /// <param name="samples">浮動小数点型の入力サンプル行列.1行あたり一つのサンプル.</param> /// <param name="cluster_count">集合を分割するクラスタ数</param> /// <param name="labels">出力の整数ベクトル.すべてのサンプルについて,それぞれがどのクラスタに属しているかが保存されている.</param> /// <param name="termcrit">最大繰り返し数と(または),精度(1ループでの各クラスタ中心位置移動距離)の指定</param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="_centers"></param> /// <returns></returns> #else /// <summary> /// Splits set of vectors by given number of clusters /// </summary> /// <param name="samples">Floating-point matrix of input samples, one row per sample. </param> /// <param name="cluster_count">Number of clusters to split the set by. </param> /// <param name="labels">Output integer vector storing cluster indices for every sample. </param> /// <param name="termcrit">Specifies maximum number of iterations and/or accuracy (distance the centers move by between the subsequent iterations). </param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="_centers"></param> /// <returns></returns> #endif public static int KMeans2(CvArr samples, int cluster_count, CvArr labels, CvTermCriteria termcrit, int attemps, CvRNG rng, KMeansFlag flag, CvArr _centers) { double compactness; return KMeans2(samples, cluster_count, labels, termcrit, attemps, rng, flag, _centers, out compactness); }
/// <summary> /// clusters the input data using k-Means algorithm /// </summary> /// <param name="data"></param> /// <param name="k"></param> /// <param name="bestLabels"></param> /// <param name="criteria"></param> /// <param name="attempts"></param> /// <param name="flags"></param> /// <param name="centers"></param> /// <returns></returns> public static double Kmeans(InputArray data, int k, InputOutputArray bestLabels, TermCriteria criteria, int attempts, KMeansFlag flags, OutputArray centers = null) { if (data == null) throw new ArgumentNullException("data"); if (bestLabels == null) throw new ArgumentNullException("bestLabels"); data.ThrowIfDisposed(); bestLabels.ThrowIfDisposed(); double ret = NativeMethods.core_kmeans(data.CvPtr, k, bestLabels.CvPtr, criteria, attempts, (int)flags, ToPtr(centers)); bestLabels.Fix(); if(centers != null) centers.Fix(); return ret; }
/// <summary> /// ベクトル集合を,与えられたクラスタ数に分割する. /// 入力サンプルを各クラスタに分類するために cluster_count 個のクラスタの中心を求める k-means 法を実装する. /// 出力 labels(i) は,配列 samples のi番目の行のサンプルが属するクラスタのインデックスを表す. /// </summary> /// <param name="samples">浮動小数点型の入力サンプル行列.1行あたり一つのサンプル.</param> /// <param name="samplesType"></param> /// <param name="clusterCount">集合を分割するクラスタ数</param> /// <param name="labels">出力の整数ベクトル.すべてのサンプルについて,それぞれがどのクラスタに属しているかが保存されている.</param> /// <param name="termcrit">最大繰り返し数と(または),精度(1ループでの各クラスタ中心位置移動距離)の指定</param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="centers"></param> /// <param name="compactness"></param> /// <returns></returns> #else /// <summary> /// Splits set of vectors by given number of clusters /// </summary> /// <param name="samples">Floating-point matrix of input samples, one row per sample. </param> /// <param name="samplesType"></param> /// <param name="clusterCount">Number of clusters to split the set by. </param> /// <param name="labels">Output integer vector storing cluster indices for every sample. </param> /// <param name="termcrit">Specifies maximum number of iterations and/or accuracy (distance the centers move by between the subsequent iterations). </param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="centers"></param> /// <param name="compactness"></param> /// <returns></returns> #endif public static int KMeans2(Array samples, MatrixType samplesType, int clusterCount, int[] labels, CvTermCriteria termcrit, int attemps, CvRNG rng, KMeansFlag flag, CvArr centers, out double compactness) { if (samples == null) { throw new ArgumentNullException("samples"); } using (CvMat samplesMat = new CvMat(labels.Length, 1, samplesType, samples, false)) using (CvMat labelsMat = new CvMat(labels.Length, 1, MatrixType.S32C1, labels, false)) { return(KMeans2(samplesMat, clusterCount, labelsMat, termcrit, attemps, rng, flag, centers, out compactness)); } }
/// <summary> /// ベクトル集合を,与えられたクラスタ数に分割する. /// 入力サンプルを各クラスタに分類するために cluster_count 個のクラスタの中心を求める k-means 法を実装する. /// 出力 labels(i) は,配列 samples のi番目の行のサンプルが属するクラスタのインデックスを表す. /// </summary> /// <param name="samples">浮動小数点型の入力サンプル行列.1行あたり一つのサンプル.</param> /// <param name="samplesType"></param> /// <param name="clusterCount">集合を分割するクラスタ数</param> /// <param name="labels">出力の整数ベクトル.すべてのサンプルについて,それぞれがどのクラスタに属しているかが保存されている.</param> /// <param name="termcrit">最大繰り返し数と(または),精度(1ループでの各クラスタ中心位置移動距離)の指定</param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="centers"></param> /// <returns></returns> #else /// <summary> /// Splits set of vectors by given number of clusters /// </summary> /// <param name="samples">Floating-point matrix of input samples, one row per sample. </param> /// <param name="samplesType"></param> /// <param name="clusterCount">Number of clusters to split the set by. </param> /// <param name="labels">Output integer vector storing cluster indices for every sample. </param> /// <param name="termcrit">Specifies maximum number of iterations and/or accuracy (distance the centers move by between the subsequent iterations). </param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="centers"></param> /// <returns></returns> #endif public static int KMeans2(Array samples, MatrixType samplesType, int clusterCount, int[] labels, CvTermCriteria termcrit, int attemps, CvRNG rng, KMeansFlag flag, CvArr centers) { double compactness; return(KMeans2(samples, samplesType, clusterCount, labels, termcrit, attemps, rng, flag, centers, out compactness)); }
/// <summary> /// ベクトル集合を,与えられたクラスタ数に分割する. /// 入力サンプルを各クラスタに分類するために cluster_count 個のクラスタの中心を求める k-means 法を実装する. /// 出力 labels(i) は,配列 samples のi番目の行のサンプルが属するクラスタのインデックスを表す. /// </summary> /// <param name="samples">浮動小数点型の入力サンプル行列.1行あたり一つのサンプル.</param> /// <param name="clusterCount">集合を分割するクラスタ数</param> /// <param name="labels">出力の整数ベクトル.すべてのサンプルについて,それぞれがどのクラスタに属しているかが保存されている.</param> /// <param name="termcrit">最大繰り返し数と(または),精度(1ループでの各クラスタ中心位置移動距離)の指定</param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="centers"></param> /// <param name="compactness"></param> /// <returns></returns> #else /// <summary> /// Splits set of vectors by given number of clusters /// </summary> /// <param name="samples">Floating-point matrix of input samples, one row per sample. </param> /// <param name="clusterCount">Number of clusters to split the set by. </param> /// <param name="labels">Output integer vector storing cluster indices for every sample. </param> /// <param name="termcrit">Specifies maximum number of iterations and/or accuracy (distance the centers move by between the subsequent iterations). </param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="centers"></param> /// <param name="compactness"></param> /// <returns></returns> #endif public static int KMeans2(CvArr samples, int clusterCount, CvArr labels, CvTermCriteria termcrit, int attemps, CvRNG rng, KMeansFlag flag, CvArr centers, out double compactness) { if (samples == null) { throw new ArgumentNullException("samples"); } if (labels == null) { throw new ArgumentNullException("labels"); } if (rng == null) { rng = new CvRNG(); } IntPtr centersPtr = (centers != null) ? centers.CvPtr : IntPtr.Zero; UInt64 rngValue = rng.Seed; int result = NativeMethods.cvKMeans2(samples.CvPtr, clusterCount, labels.CvPtr, termcrit, attemps, ref rngValue, flag, centersPtr, out compactness); rng.Seed = rngValue; KeepAlive(samples, labels, centers); return(result); }
/// <summary> /// ベクトル集合を,与えられたクラスタ数に分割する. /// 入力サンプルを各クラスタに分類するために cluster_count 個のクラスタの中心を求める k-means 法を実装する. /// 出力 labels(i) は,配列 samples のi番目の行のサンプルが属するクラスタのインデックスを表す. /// </summary> /// <param name="samples">浮動小数点型の入力サンプル行列.1行あたり一つのサンプル.</param> /// <param name="clusterCount">集合を分割するクラスタ数</param> /// <param name="labels">出力の整数ベクトル.すべてのサンプルについて,それぞれがどのクラスタに属しているかが保存されている.</param> /// <param name="termcrit">最大繰り返し数と(または),精度(1ループでの各クラスタ中心位置移動距離)の指定</param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <returns></returns> #else /// <summary> /// Splits set of vectors by given number of clusters /// </summary> /// <param name="samples">Floating-point matrix of input samples, one row per sample. </param> /// <param name="clusterCount">Number of clusters to split the set by. </param> /// <param name="labels">Output integer vector storing cluster indices for every sample. </param> /// <param name="termcrit">Specifies maximum number of iterations and/or accuracy (distance the centers move by between the subsequent iterations). </param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <returns></returns> #endif public static int KMeans2(CvArr samples, int clusterCount, CvArr labels, CvTermCriteria termcrit, int attemps, CvRNG rng, KMeansFlag flag) { double compactness; return(KMeans2(samples, clusterCount, labels, termcrit, attemps, rng, flag, null, out compactness)); }
/// <summary> /// ベクトル集合を,与えられたクラスタ数に分割する. /// 入力サンプルを各クラスタに分類するために cluster_count 個のクラスタの中心を求める k-means 法を実装する. /// 出力 labels(i) は,配列 samples のi番目の行のサンプルが属するクラスタのインデックスを表す. /// </summary> /// <param name="samples">浮動小数点型の入力サンプル行列.1行あたり一つのサンプル.</param> /// <param name="samplesType"></param> /// <param name="clusterCount">集合を分割するクラスタ数</param> /// <param name="labels">出力の整数ベクトル.すべてのサンプルについて,それぞれがどのクラスタに属しているかが保存されている.</param> /// <param name="termcrit">最大繰り返し数と(または),精度(1ループでの各クラスタ中心位置移動距離)の指定</param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="centers"></param> /// <param name="compactness"></param> /// <returns></returns> #else /// <summary> /// Splits set of vectors by given number of clusters /// </summary> /// <param name="samples">Floating-point matrix of input samples, one row per sample. </param> /// <param name="samplesType"></param> /// <param name="clusterCount">Number of clusters to split the set by. </param> /// <param name="labels">Output integer vector storing cluster indices for every sample. </param> /// <param name="termcrit">Specifies maximum number of iterations and/or accuracy (distance the centers move by between the subsequent iterations). </param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="centers"></param> /// <param name="compactness"></param> /// <returns></returns> #endif public static int KMeans2(Array samples, MatrixType samplesType, int clusterCount, int[] labels, CvTermCriteria termcrit, int attemps, CvRNG rng, KMeansFlag flag, CvArr centers, out double compactness) { if (samples == null) throw new ArgumentNullException("samples"); using (CvMat samplesMat = new CvMat(labels.Length, 1, samplesType, samples, false)) using (CvMat labelsMat = new CvMat(labels.Length, 1, MatrixType.S32C1, labels, false)) { return KMeans2(samplesMat, clusterCount, labelsMat, termcrit, attemps, rng, flag, centers, out compactness); } }
/// <summary> /// ベクトル集合を,与えられたクラスタ数に分割する. /// 入力サンプルを各クラスタに分類するために cluster_count 個のクラスタの中心を求める k-means 法を実装する. /// 出力 labels(i) は,配列 samples のi番目の行のサンプルが属するクラスタのインデックスを表す. /// </summary> /// <param name="samples">浮動小数点型の入力サンプル行列.1行あたり一つのサンプル.</param> /// <param name="samplesType"></param> /// <param name="clusterCount">集合を分割するクラスタ数</param> /// <param name="labels">出力の整数ベクトル.すべてのサンプルについて,それぞれがどのクラスタに属しているかが保存されている.</param> /// <param name="termcrit">最大繰り返し数と(または),精度(1ループでの各クラスタ中心位置移動距離)の指定</param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="centers"></param> /// <returns></returns> #else /// <summary> /// Splits set of vectors by given number of clusters /// </summary> /// <param name="samples">Floating-point matrix of input samples, one row per sample. </param> /// <param name="samplesType"></param> /// <param name="clusterCount">Number of clusters to split the set by. </param> /// <param name="labels">Output integer vector storing cluster indices for every sample. </param> /// <param name="termcrit">Specifies maximum number of iterations and/or accuracy (distance the centers move by between the subsequent iterations). </param> /// <param name="attemps"></param> /// <param name="rng"></param> /// <param name="flag"></param> /// <param name="centers"></param> /// <returns></returns> #endif public static int KMeans2(Array samples, MatrixType samplesType, int clusterCount, int[] labels, CvTermCriteria termcrit, int attemps, CvRNG rng, KMeansFlag flag, CvArr centers) { double compactness; return KMeans2(samples, samplesType, clusterCount, labels, termcrit, attemps, rng, flag, centers, out compactness); }