Sorry for the mistake!! I have update this post? Can you try this and show me the results running on your machine??
Hi everyone,
I'm using the EM module of opencv(tried 2.4.2 and 2.4.3). I wants to try my samples(676*64) which is generated by SIFT+PCA by EM. but I have tried to use the same samples to train the EM to get the Gaussian mixture model. But the results are different.
here is a test code.
cv::Mat samples(50,2,CV_32FC1);
samples = samples.reshape(2,0);
int N=9, n1 = sqrt(9.0);
for(int i=0; i<N; ++i)
{
cv::Mat subSamples = samples.rowRange(i*50/N, (i+1)*50/N );
cv::Scalar mean((i%3 +1)*256/4, (i/3+1)*256/4);
cv::Scalar var(30,30);
cv::randn(subSamples, mean, var);
}
samples = samples.reshape(1,0);
samples.convertTo(samples, CV_64FC1);
std::cout<<"samples"<<std::endl;
for(int j=0; j<samples.rows; ++j){
for(int i=0; i<samples.cols; ++i)
std::cout<<samples.at<double>(j, i)<<" ";
std::cout<<std::endl;
}
std::cout<<std::endl;
CvEM m_emModel1;
CvEMParams params1;
cv::Mat labels1;
params1.covs = NULL;
params1.means = NULL;
params1.weights = NULL;
params1.probs = NULL;
params1.nclusters = 10;
params1.cov_mat_type = CvEM::COV_MAT_SPHERICAL;
params1.start_step = CvEM::START_AUTO_STEP;
params1.term_crit.type = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;
m_emModel1.train(samples, cv::Mat(), params1, &labels1);
std::cout<<"means1"<<std::endl;
for(int j=0; j<10; ++j){
for(int i=0; i<2; ++i)
std::cout<<m_emModel1.getMeans().at<double>(j, i)<<" ";
std::cout<<std::endl;
}
std::cout<<"weightes1"<<std::endl;
for(int j=0; j<10; ++j)
std::cout<<m_emModel1.getWeights().at<double>(j)<<" ";
std::cout<<std::endl;
CvEM m_emModel;
CvEMParams params;
cv::Mat labels;
params.covs = NULL;
params.means = NULL;
params.weights = NULL;
params.probs = NULL;
params.nclusters = 10;
params.cov_mat_type = CvEM::COV_MAT_SPHERICAL;
params.start_step = CvEM::START_AUTO_STEP;
params.term_crit.type = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;
m_emModel.train(samples, cv::Mat(), params, &labels);
std::cout<<"means"<<std::endl;
for(int j=0; j<10; ++j){
for(int i=0; i<2; ++i)
std::cout<<m_emModel.getMeans().at<double>(j, i)<<" ";
std::cout<<std::endl;
}
std::cout<<"weightes"<<std::endl;
for(int j=0; j<10; ++j)
std::cout<<m_emModel.getWeights().at<double>(j)<<" ";
std::cout<<std::endl;
here is a result:
I really hope your replys, thanks your reading.