OpenCV: extracción de color basada en el modelo de mezcla gaussiana.

Estoy tratando de usar el algoritmo opencv EM para extraer el color. Estoy usando el siguiente código basado en el ejemplo en la documentación de opencv:

cv::Mat capturedFrame ( height, width, CV_8UC3 );
int i, j;
int nsamples = 1000;
cv::Mat samples ( nsamples, 2, CV_32FC1 );
cv::Mat labels;
cv::Mat img = cv::Mat::zeros ( height, height, CV_8UC3 );
img = capturedFrame;
cv::Mat sample ( 1, 2, CV_32FC1 );
CvEM em_model;
CvEMParams params;
samples = samples.reshape ( 2, 0 );

    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 );     

    cv::Mat probs;
    probs = em_model.getProbs();

    cv::Mat weights;
    weights = em_model.getWeights();

cv::Mat modelIndex = cv::Mat::zeros ( img.rows, img.cols, CV_8UC3 );

for ( i = 0; i < img.rows; i ++ )
{
    for ( j = 0; j < img.cols; j ++ )
    {
        sample.at<float>(0) = (float)j;
    sample.at<float>(1) = (float)i;     

    int response = cvRound ( em_model.predict ( sample ) ); 
    modelIndex.data [ modelIndex.cols*i + j] = response;

    }
}

Mi pregunta aquí es:

en primer lugarQuiero extraer cada modelo, aquí en total cinco, luego almacenar esos valores de píxel correspondientes en cinco matrices diferentes. En este caso, podría tener cinco colores diferentes por separado. Aquí solo obtuve sus índices, ¿hay alguna manera de lograr sus colores correspondientes aquí? Para hacerlo más fácil, puedo comenzar por encontrar el color dominante basado en estos cinco GMM.

En segundo lugar, aquí mis puntos de datos de muestra son "100", y les toma cerca de 3 segundos. Pero quiero hacer todas estas cosas en no más de 30 milisegundos. Sé que la extracción en segundo plano de OpenCV, que está utilizando GMM, se realiza realmente rápido, por debajo de 20 ms, es decir, debe haber una manera de hacer todo esto dentro de los 30 ms para todos los 600x800 = 480000 píxeles. encontrépredict La función es la que consume más tiempo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta