Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video OpenCV:如何对GMM计算的问题进行分类_Video_Opencv_Model_Background_Gaussian - Fatal编程技术网

Video OpenCV:如何对GMM计算的问题进行分类

Video OpenCV:如何对GMM计算的问题进行分类,video,opencv,model,background,gaussian,Video,Opencv,Model,Background,Gaussian,我使用opencv EM算法,借助opencv文档中的示例代码获得GMM模型,如下所示: cv::Mat capturedFrame const int N = 5; int nsamples = 100; cv::Mat samples ( nsamples, 2, CV_32FC1 ); samples = samples.reshape ( 2, 0 ); cv::Mat sample ( 1, 2, CV_32FC1 ); CvEM em_model; CvEMParams param

我使用opencv EM算法,借助opencv文档中的示例代码获得GMM模型,如下所示:

cv::Mat capturedFrame
const int N = 5; 
int nsamples = 100;
cv::Mat samples ( nsamples, 2, CV_32FC1 );
samples = samples.reshape ( 2, 0 );
cv::Mat sample ( 1, 2, CV_32FC1 );
CvEM em_model;
CvEMParams params;

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 );
那么我怎样才能得到包含最多和最少元素的模型,即最大和最小的模型

其次,我的示例数据在这里只有100,就像opencv的示例代码一样,但我正在读取一个大小为600x800的帧,我想对其中的所有像素进行采样,即480000。但这100个样本大约需要10毫秒,这意味着如果我设置:

int nsamples = 480000;

我来对了吗

如果我答对了你的问题,你所谓的“最大”和“最小”模型指的是混合物中每个高斯分布的权重。您可以使用获取与高斯相关联的权重


关于第二个问题,如果你用480000个样本而不是100个来训练你的模型,是的,它肯定会更长。“太慢”取决于你的要求。但是EM是一个分类模型,所以通常要做的是,必须使用足够数量的样本来训练模型。这是一个漫长的过程,但通常是“离线”完成的。然后,您可以使用该模型“预测”新样本,即获得与新输入样本相关联的概率。调用
getProbs()
函数时,将获得与训练样本相关联的概率。如果要获取未知样本(通常是视频帧中的像素)的概率,请调用该函数。

非常感谢您的回答。还有一个问题:我发现“预测”给了我当前像素所属模型的索引。所以我想做的是,提取那些具有最大和最小模型索引的像素,并将它们的像素值保存到两个不同的矩阵中。我尝试将索引保存在两个cvScalar中,并读取原始帧矩阵中相应的像素值,但它不起作用。你知道吗?再次感谢。predict返回一个与高斯指数对应的浮点值,具有最大后验概率。您可以将矩阵作为附加参数传递,以预测与模型中每个高斯相关联的概率将存储在何处。使用此矩阵,您可以获得每个像素的最小和最大概率。该矩阵将具有“样本数”行和“高斯数”列,因此该矩阵中x、y位置的值对应于样本x根据高斯y的后验概率
int nsamples = 480000;