Я использую алгоритм opencv EM для получения моделей GMM с помощью примера кода в документации opencv следующим образом:
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();
Тогда как мне получить модели с наибольшим и наименьшим количеством элементов, то есть самые большие и самые маленькие модели?
Во-вторых, мои выборочные данные здесь всего 100, как и в примере кода opencv, но я читаю кадр размером 600x800, и я хочу сэмплировать все эти пиксели в нем, а это 480000. Но для этих 100 семплов требуется около 10 мс, это означает, что было бы слишком медленно, если бы я установил:
int nsamples = 480000;
Я на правильном пути здесь?