我想使用OpenCV的EM算法顏色extraction.I正在使用基於OpenCV的例子文檔中下面的代碼做顏色提取: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;
}
}
這裏我的問題是:
首先,我想提取每個模型,這裏總共五個,然後將這些相應的像素值存儲在五個不同的矩陣。在這種情況下,我可以分別使用五種不同的顏色。在這裏我只獲得了他們的索引,有沒有什麼方法可以在這裏實現他們相應的顏色?爲了簡單起見,我可以從找到基於這五種GMM的主色調開始。
其次,這裏我的示例數據點是「100」,它需要將近3秒。但我想在不超過30毫秒的時間內完成所有這些事情。我知道使用GMM的OpenCV背景提取非常快速,低於20ms,這意味着,我必須在30毫秒內爲所有600x800 = 480000像素完成所有這些操作。我發現predict
函數是最耗時的。
這個問題仍然有效嗎?或者它解決了[有](http://stackoverflow.com/questions/12909343/opencv-how-to-categorize-gmm-calculated-probs/12909985#12909985)? Regards – remi
@remi:這個問題是一個老問題,但在我問了你回答的另一個問題後,我用顏色提取和計算速度更新了這個問題。你可以幫幫我嗎?謝謝。 –
我真的不明白這個問題。提取顏色對我來說沒有意義。你想要計算主色嗎?或量化顏色?你的代碼不會幫助我很多。關於速度問題,在大多數情況下使用'params.cov_mat_type = COV_MAT_DIAGONAL'就足夠了,並且會加快你的過程。 – remi