Opencv 在GrabCut中通过随机采样初始化GMM

Opencv 在GrabCut中通过随机采样初始化GMM,opencv,image-processing,image-segmentation,Opencv,Image Processing,Image Segmentation,实际上,您希望删除GrabCut中的初始矩形选择。对于这一点,在用户交互的最开始,背景颜色模型pb(·)(GMM)通过从背景中随机抽样若干像素(通常为1200)来初始化。在每个后续的用户交互中,我们用从背景中随机采样的相同数量的像素替换在先前交互中标记为前景的样本。使用更新的样本重新估计背景GMM 为此,我删除了initMaskWithRect()函数。我想更新GrabCut中的以下函数,以使用随机采样进行初始化 /* Initialize GMM background and foregr

实际上,您希望删除GrabCut中的初始矩形选择。对于这一点,在用户交互的最开始,背景颜色模型pb(·)(GMM)通过从背景中随机抽样若干像素(通常为1200)来初始化。在每个后续的用户交互中,我们用从背景中随机采样的相同数量的像素替换在先前交互中标记为前景的样本。使用更新的样本重新估计背景GMM

为此,我删除了initMaskWithRect()函数。我想更新GrabCut中的以下函数,以使用随机采样进行初始化

/*
  Initialize GMM background and foreground models using kmeans algorithm.
*/
static 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;
    std::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 );
    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 );

    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();
}
/*
使用kmeans算法初始化GMM背景和前景模型。
*/
静态空隙初始GMMS(常数垫和img、常数垫和掩模、GMM和bgdGMM、GMM和fgdGMM)
{
常数int kMeansItCount=10;
const int kMeansType=KMEANS\u PP\u中心;
Mat bgdLabels,fgdLabels;
std::矢量BGD样本,FGD样本;
p点;
对于(p.y=0;p.y
怎么做