OpenCV: ekstrakcja kolorów na podstawie modelu mieszanki Gaussa

Próbuję użyć algorytmu opencv EM do ekstrakcji kolorów. Używam następującego kodu opartego na przykładzie w dokumentacji 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;

    }
}

Moje pytanie brzmi:

po pierwsze, Chcę wyodrębnić każdy model, tutaj całkowicie pięć, a następnie zapisać te odpowiednie wartości pikseli w pięciu różnych macierzach. W tym przypadku mogłem osobno mieć pięć różnych kolorów. Tu tylko uzyskałem ich indeksy, czy jest jakiś sposób na osiągnięcie ich odpowiednich kolorów tutaj? Aby to ułatwić, mogę zacząć od znalezienia dominującego koloru na podstawie tych pięciu GMM.

Po drugie, tutaj moje przykładowe punkty danych to „100” i zajmuje im to prawie 3 sekundy. Ale chcę to wszystko zrobić w nie więcej niż 30 milisekund. Wiem, że ekstrakcja tła OpenCV, która korzysta z GMM, działa naprawdę szybko, poniżej 20 ms, co oznacza, że ​​musi być sposób na zrobienie tego wszystkiego w ciągu 30 ms dla wszystkich 600x800 = 480000 pikseli. znalazłempredict funkcja jest najbardziej czasochłonna.

questionAnswers(1)

yourAnswerToTheQuestion