title: OpenCV: color extraction based on Gaussian mixture model
body: <p>I am trying to use opencv EM algorithm to do color extraction.I am using the following code based on example in opencv documentation:</p>
  
  <pre><code>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 &lt; 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, &amp;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 &lt; img.rows; i ++ )
  {
      for ( j = 0; j &lt; img.cols; j ++ )
      {
          sample.at&lt;float&gt;(0) = (float)j;
      sample.at&lt;float&gt;(1) = (float)i;     
  
      int response = cvRound ( em_model.predict ( sample ) ); 
      modelIndex.data [ modelIndex.cols*i + j] = response;
  
      }
  }
  </code></pre>
  
  <p>My question here is:</p>
  
  <p><strong>Firstly</strong>, I want to extract each model, here totally five, then store those corresponding pixel values in five different matrix. In this case, I could have five different colors seperately. Here I only obtained their indexes, is there any way to achieve their corresponding colors here? To make it easy, I can start from finding the dominant color based on these five GMMs. </p>
  
  <p><strong>Secondly</strong>, here my sample datapoints are "100", and it takes about nearly 3 seconds for them. But I want to do all these things in no more than 30 milliseconds. I know OpenCV background extraction, which is using GMM, performs really fast, below 20ms, that means, there must be a way for me to do all these within 30 ms for all 600x800=480000 pixels. I found <code>predict</code> function is the most time consuming one.  </p>