【发布时间】:2012-09-11 11:58:33
【问题描述】:
我正在尝试使用 opencv EM 算法进行颜色提取。我正在使用基于 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 背景提取执行得非常快,低于 20 毫秒,这意味着我必须有一种方法可以在 30 毫秒内完成所有 600x800=480000 像素的所有这些操作。我发现predict 函数是最耗时的一个。
【问题讨论】:
-
这个问题还有效吗?还是解决了there?问候
-
@remi:这个问题是一个老问题,但是在我问了你回答的另一个问题之后,我用颜色提取和计算速度更新了这个问题。你可以帮帮我吗?谢谢。
-
我不太明白这个问题。提取颜色对我来说没有意义。您是否尝试计算主色?或者量化颜色?你的代码对我帮助不大。关于速度问题,在大多数情况下使用
params.cov_mat_type = COV_MAT_DIAGONAL就足够了,并且会加快您的进程 -
@remi 我正在尝试提取场景的每种颜色,从主要颜色开始。请在这个话题上帮助我。谢谢。
-
@remi 我试过“params.cov_mat_type = COV_MAT_DIAGONAL”,但没有什么大的不同。
标签: c++ opencv colors extract gaussian