/* Learn GMMs parameters. */ void learnGMMs( const Mat& img, const Mat& mask, const Mat& compIdxs, GMM& bgdGMM, GMM& fgdGMM ) { bgdGMM.initLearning(); fgdGMM.initLearning(); Point p; for( int ci = 0; ci < GMM::componentsCount; ci++ ) { for( p.y = 0; p.y < img.rows; p.y++ ) { for( p.x = 0; p.x < img.cols; p.x++ ) { if( compIdxs.at<int>(p) == ci ) { if( mask.at<uchar>(p) == GC_BGD || mask.at<uchar>(p) == GC_PR_BGD ) bgdGMM.addSample( ci, img.at<Vec3b>(p) ); else fgdGMM.addSample( ci, img.at<Vec3b>(p) ); } } } } bgdGMM.endLearning(); fgdGMM.endLearning(); }
/* Initialize GMM background and foreground models using kmeans algorithm. */ void initGMMs( const Mat& img, const Mat& mask, GMM& bgdGMM, GMM& fgdGMM ) { const int kMeansItCount = 10; const int kMeansType = KMEANS_PP_CENTERS; Mat bgdLabels, fgdLabels; vector<Vec3f> bgdSamples, fgdSamples; Point p; for( p.y = 0; p.y < img.rows; p.y++ ) { for( p.x = 0; p.x < img.cols; p.x++ ) { if( mask.at<uchar>(p) == GC_BGD || mask.at<uchar>(p) == GC_PR_BGD ) bgdSamples.push_back( (Vec3f)img.at<Vec3b>(p) ); else // GC_FGD | GC_PR_FGD fgdSamples.push_back( (Vec3f)img.at<Vec3b>(p) ); } } CV_Assert( !bgdSamples.empty() && !fgdSamples.empty() ); Mat _bgdSamples( (int)bgdSamples.size(), 3, CV_32FC1, &bgdSamples[0][0] ); kmeans( _bgdSamples, GMM::componentsCount, bgdLabels, TermCriteria( CV_TERMCRIT_ITER, kMeansItCount, 0.0), 0, kMeansType, 0 ); Mat _fgdSamples( (int)fgdSamples.size(), 3, CV_32FC1, &fgdSamples[0][0] ); kmeans( _fgdSamples, GMM::componentsCount, fgdLabels, TermCriteria( CV_TERMCRIT_ITER, kMeansItCount, 0.0), 0, kMeansType, 0 ); bgdGMM.initLearning(); for( int i = 0; i < (int)bgdSamples.size(); i++ ) bgdGMM.addSample( bgdLabels.at<int>(i,0), bgdSamples[i] ); bgdGMM.endLearning(); fgdGMM.initLearning(); for( int i = 0; i < (int)fgdSamples.size(); i++ ) fgdGMM.addSample( fgdLabels.at<int>(i,0), fgdSamples[i] ); fgdGMM.endLearning(); }