OpenCV: Farbe-Extraktion basierend auf Gaussian mixture model
Ich bin versucht, opencv EM-Algorithmus zu tun, Farb-Extraktion.Ich benutze folgende code basiert auf dem Beispiel in der opencv-Dokumentation:
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:
Erstens, ich will zu extrahieren jedes Modell, hier insgesamt fünf, und speichern Sie dann die entsprechenden pixel-Werte in fünf verschiedenen matrix. In diesem Fall hätte ich fünf verschiedene Farben getrennt. Hier habe ich nur erhalten, Ihre Indizes, gibt es eine Möglichkeit, um Ihre entsprechenden Farben hier? Machen Sie es sich einfach, kann ich damit beginnen, von der Suche nach der dominanten Farbe, die basierend auf diesen fünf GVM.
Zweitens, hier mein Beispiel Datenpunkte sind "100", und es dauert fast 3 Sekunden für Sie. Aber ich möchte all diese Dinge zu tun, die in nicht mehr als 30 Millisekunden. Ich weiß, OpenCV hintergrund-Extraktion, die mit GMM, führt wirklich schnell, unter 20ms, das heißt, es muss einen Weg für mich zu tun, alle diese innerhalb von 30 ms für alle 600x800=480000 Pixel. Ich fand predict
Funktion ist die meiste Zeit verbrauchen.
- Ist diese Frage noch aktiv? Oder wurde es gelöst there ? Grüße
- diese Frage war ein altes, aber nachdem ich eine weitere Frage gestellt, die du beantwortet, ich aktualisiert, das ist eine Farbe, die Extraktion und Berechnung Geschwindigkeit. Könnten Sie mir helfen? Danke.
- Ich nicht wirklich verstehen, diese Frage. Extrahieren von Farben ist nicht sinnvoll für mich. Sind Sie versuchen, zu berechnen, die dominierenden Farben? Oder die Quantisierung der Farben? Ihr code dont helfen mir viel. Hinsichtlich Geschwindigkeit Problem, mit
params.cov_mat_type = COV_MAT_DIAGONAL
ist genug für die meisten Fälle und beschleunigt Ihren Prozess - Ich bin versucht zu extrahieren, die jede Farbe einer Szene, von der dominante. Bitte helfen Sie mir zu diesem Thema. Danke.
- Ich habe versucht, "params.cov_mat_type = COV_MAT_DIAGONAL" aber es hat keinen großen Unterschied.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste Frage:
Damit zu tun, Farb-Extraktion, müssen Sie zuerst den Zug der EM mit Ihrem input Pixel. Nach, dass Sie einfach eine Schleife über alle input-Pixel wieder und verwenden predict() zum klassifizieren der einzelnen von Ihnen. Ich habe schonmal ein kleines Beispiel, nutzt EM für die Vordergrund - /hintergrund-Trennung basierend auf Farben. Es zeigt Ihnen, wie Sie zu extrahieren, die dominante Farbe (mean) der einzelnen Gauß und wie Sie Zugang zu den ursprünglichen pixel Farbe.
Getestet hab ich den code mit dem folgenden Bild und führt es ganz gut.
Zweite Frage:
Habe ich bemerkt, dass die maximale Anzahl von Clustern hat einen großen Einfluss auf die performance. So ist es besser, diese auf einen sehr konservativen Wert, anstatt es leer zu lassen oder es für die Anzahl der samples, wie in deinem Beispiel. Außerdem die Dokumentation erwähnt ein iterativer Vorgang wiederholt und Optimierung des Modells mit weniger eingeschränkte Parameter. Vielleicht gibt Sie einige speed-up. Um mehr zu Lesen bitte haben Sie einen Blick auf die Dokumente im inneren der Beispielcode für die Bahn() hier.