次のように、opencvドキュメントのサンプルコードを使用して、opencv EMアルゴリズムを使用してGMMモデルを取得しています。
cv::Mat capturedFrame
const int N = 5;
int nsamples = 100;
cv::Mat samples ( nsamples, 2, CV_32FC1 );
samples = samples.reshape ( 2, 0 );
cv::Mat sample ( 1, 2, CV_32FC1 );
CvEM em_model;
CvEMParams params;
for ( i = 0; i < N; i++ )
{
//from the training samples
cv::Mat samples_part = samples.rowRange ( i*nsamples/N, (i+1)*nsamples/N);
cv::Scalar mean (((i%N)+1)*img.rows/(N1+1),((i/N1)+1)*img.rows/(N1+1));
cv::Scalar sigma (30,30);
cv::randn(samples_part,mean,sigma);
}
samples = samples.reshape ( 1, 0 );
//initialize model parameters
params.covs = NULL;
params.means = NULL;
params.weights = NULL;
params.probs = NULL;
params.nclusters = N;
params.cov_mat_type = CvEM::COV_MAT_SPHERICAL;
params.start_step = CvEM::START_AUTO_STEP;
params.term_crit.max_iter = 300;
params.term_crit.epsilon = 0.1;
params.term_crit.type = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;
//cluster the data
em_model.train ( samples, Mat(), params, &labels );
GMM と openCV を初めて使用するので、いくつか質問があります。
まず、上記のコードを実行した後、次のようなプロブを取得できます。
cv::Mat probs = em_model.getProbs();
では、要素が最も多いモデルと最も少ないモデル、つまり最大モデルと最小モデルを取得するにはどうすればよいでしょうか?
次に、opencv のサンプル コードのように、サンプル データはここでは 100 しかありませんが、サイズが 600x800 のフレームを読み取っていて、その中のすべてのピクセル (480000) をサンプリングしたいのですが、約 10 ミリ秒かかります。これらの 100 個のサンプルは、次のように設定すると非常に遅くなることを意味します。
int nsamples = 480000;
私はここで正しい道を進んでいますか?