OpenCV: Farbextraktion nach dem Gaußschen Mischungsmodell

Ich versuche, den OpenCV-EM-Algorithmus für die Farbextraktion zu verwenden. Ich verwende den folgenden Code, der auf einem Beispiel in der OpenCV-Dokumentation basiert:

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;

    }
}

Meine Frage hier ist:

zuerstIch möchte jedes Modell extrahieren, hier insgesamt fünf, und dann die entsprechenden Pixelwerte in fünf verschiedenen Matrizen speichern. In diesem Fall könnte ich fünf verschiedene Farben separat haben. Hier habe ich nur ihre Indizes erhalten, gibt es eine Möglichkeit, hier die entsprechenden Farben zu erzielen? Um es einfacher zu machen, kann ich mit der Ermittlung der dominanten Farbe anhand dieser fünf GMM beginnen.

Zweitens, hier sind meine Beispieldatenpunkte "100", und es dauert ungefähr 3 Sekunden für sie. Aber ich möchte all diese Dinge in nicht mehr als 30 Millisekunden erledigen. Ich weiß, dass die OpenCV-Hintergrundextraktion, die GMM verwendet, sehr schnell ist, unter 20 ms. Das bedeutet, dass ich alle diese Schritte innerhalb von 30 ms für alle 600 x 800 = 480000 Pixel ausführen kann. ich fandpredict Funktion ist die zeitaufwändigste.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage