Initialize GMM background and foreground models using kmeans algorithm. */
| 359 | Initialize GMM background and foreground models using kmeans algorithm. |
| 360 | */ |
| 361 | static void initGMMs( const Mat& img, const Mat& mask, GMM& bgdGMM, GMM& fgdGMM ) |
| 362 | { |
| 363 | const int kMeansItCount = 10; |
| 364 | const int kMeansType = KMEANS_PP_CENTERS; |
| 365 | |
| 366 | Mat bgdLabels, fgdLabels; |
| 367 | vector<Vec3f> bgdSamples, fgdSamples; |
| 368 | Point p; |
| 369 | for( p.y = 0; p.y < img.rows; p.y++ ) |
| 370 | { |
| 371 | for( p.x = 0; p.x < img.cols; p.x++ ) |
| 372 | { |
| 373 | if( mask.at<uchar>(p) == GC_BGD || mask.at<uchar>(p) == GC_PR_BGD ) |
| 374 | bgdSamples.push_back( (Vec3f)img.at<Vec3b>(p) ); |
| 375 | else // GC_FGD | GC_PR_FGD |
| 376 | fgdSamples.push_back( (Vec3f)img.at<Vec3b>(p) ); |
| 377 | } |
| 378 | } |
| 379 | CV_Assert( !bgdSamples.empty() && !fgdSamples.empty() ); |
| 380 | Mat _bgdSamples( (int)bgdSamples.size(), 3, CV_32FC1, &bgdSamples[0][0] ); |
| 381 | kmeans( _bgdSamples, GMM::componentsCount, bgdLabels, |
| 382 | TermCriteria( CV_TERMCRIT_ITER, kMeansItCount, 0.0), 0, kMeansType ); |
| 383 | Mat _fgdSamples( (int)fgdSamples.size(), 3, CV_32FC1, &fgdSamples[0][0] ); |
| 384 | kmeans( _fgdSamples, GMM::componentsCount, fgdLabels, |
| 385 | TermCriteria( CV_TERMCRIT_ITER, kMeansItCount, 0.0), 0, kMeansType ); |
| 386 | |
| 387 | bgdGMM.initLearning(); |
| 388 | for( int i = 0; i < (int)bgdSamples.size(); i++ ) |
| 389 | bgdGMM.addSample( bgdLabels.at<int>(i,0), bgdSamples[i] ); |
| 390 | bgdGMM.endLearning(); |
| 391 | |
| 392 | fgdGMM.initLearning(); |
| 393 | for( int i = 0; i < (int)fgdSamples.size(); i++ ) |
| 394 | fgdGMM.addSample( fgdLabels.at<int>(i,0), fgdSamples[i] ); |
| 395 | fgdGMM.endLearning(); |
| 396 | } |
| 397 | |
| 398 | /* |
| 399 | Assign GMMs components for each pixel. |
no test coverage detected