/// <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);
        }
Esempio n. 2
0
        /// <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;
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
 /// <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;
 }
Esempio n. 5
0
        /// <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));
                }
        }
Esempio n. 6
0
        /// <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));
        }
Esempio n. 7
0
        /// <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);
        }
Esempio n. 8
0
        /// <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));
        }
Esempio n. 9
0
        /// <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);
            }
        }
Esempio n. 10
0
        /// <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);
        }