| 526 | } |
| 527 | |
| 528 | void cv::grabCut( InputArray _img, InputOutputArray _mask, Rect rect, |
| 529 | InputOutputArray _bgdModel, InputOutputArray _fgdModel, |
| 530 | int iterCount, int mode ) |
| 531 | { |
| 532 | Mat img = _img.getMat(); |
| 533 | Mat& mask = _mask.getMatRef(); |
| 534 | Mat& bgdModel = _bgdModel.getMatRef(); |
| 535 | Mat& fgdModel = _fgdModel.getMatRef(); |
| 536 | |
| 537 | if( img.empty() ) |
| 538 | CV_Error( CV_StsBadArg, "image is empty" ); |
| 539 | if( img.type() != CV_8UC3 ) |
| 540 | CV_Error( CV_StsBadArg, "image mush have CV_8UC3 type" ); |
| 541 | |
| 542 | GMM bgdGMM( bgdModel ), fgdGMM( fgdModel ); |
| 543 | Mat compIdxs( img.size(), CV_32SC1 ); |
| 544 | |
| 545 | if( mode == GC_INIT_WITH_RECT || mode == GC_INIT_WITH_MASK ) |
| 546 | { |
| 547 | if( mode == GC_INIT_WITH_RECT ) |
| 548 | initMaskWithRect( mask, img.size(), rect ); |
| 549 | else // flag == GC_INIT_WITH_MASK |
| 550 | checkMask( img, mask ); |
| 551 | initGMMs( img, mask, bgdGMM, fgdGMM ); |
| 552 | } |
| 553 | |
| 554 | if( iterCount <= 0) |
| 555 | return; |
| 556 | |
| 557 | if( mode == GC_EVAL ) |
| 558 | checkMask( img, mask ); |
| 559 | |
| 560 | const double gamma = 50; |
| 561 | const double lambda = 9*gamma; |
| 562 | const double beta = calcBeta( img ); |
| 563 | |
| 564 | Mat leftW, upleftW, upW, uprightW; |
| 565 | calcNWeights( img, leftW, upleftW, upW, uprightW, beta, gamma ); |
| 566 | |
| 567 | for( int i = 0; i < iterCount; i++ ) |
| 568 | { |
| 569 | GCGraph<double> graph; |
| 570 | assignGMMsComponents( img, mask, bgdGMM, fgdGMM, compIdxs ); |
| 571 | learnGMMs( img, mask, compIdxs, bgdGMM, fgdGMM ); |
| 572 | constructGCGraph(img, mask, bgdGMM, fgdGMM, lambda, leftW, upleftW, upW, uprightW, graph ); |
| 573 | estimateSegmentation( graph, mask ); |
| 574 | } |
| 575 | } |
nothing calls this directly
no test coverage detected