【问题标题】:openCV grabcut GC_INIT_WITH_MASK first iterationopenCV 抓取 GC_INIT_WITH_MASK 第一次迭代
【发布时间】:2014-09-25 15:03:43
【问题描述】:

他, 如何使用掩码初始化第一个 Grabcut?就我而言,每次我遇到此错误时:(-215) !bgdSamples.empty() && !fgdSamples.empty() 在函数 initGMMs 中。 是否可以使用掩码运行第一次 Grabcut 迭代?当我将第一个 Grabcut Iteration 与 Rect 一起使用时,它已经可以工作了。这是我的带掩码初始化代码(第二次迭代):

mask = Mat::ones(image_.size(), CV_8UC1) * GC_PR_BGD; //GC_PR_BGD
// GrabCut segmentation
    grabCut(GrabCut::image,    // input image
            GrabCut::mask,   // segmentation result
            Rect(),// rectangle containing foreground
            GrabCut::bgModel,GrabCut::fgModel, // models
            iteration,       // number of iterations
            GC_INIT_WITH_MASK ); // use mask

仅供参考 当模式设置为 GC_INIT_WITH_RECT 时,该函数会初始化掩码。 面具有 4 个“层”:

GC_BGD defines an obvious background pixels.
GC_FGD defines an obvious foreground (object) pixel.
GC_PR_BGD defines a possible background pixel.
GC_PR_FGD defines a possible foreground pixel.

(http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html?highlight=grabcut#cv2.grabCut)

谢谢

【问题讨论】:

    标签: c++ opencv image-segmentation


    【解决方案1】:

    它并不完美,但结果很干净,并且图像边缘没有矩形。

    1. 第一个使用 rect 的 Grabcut 初始化
    2. 使用 GC_PR_FGD/BGD 作为颜色在图像周围画一个更大的矩形

      int xyCord = 1;
      int size = 2*xyCord;
          rectangle(GrabCut::mask, Point(xyCord,xyCord),Point(GrabCut::image.cols-size,GrabCut::image.rows-size),Scalar(GC_PR_FGD),30);
          rectangle(GrabCut::mask, Point(xyCord,xyCord), Point(GrabCut::image.cols-size,GrabCut::image.rows-size),Scalar(GC_PR_BGD),30);
      
    3. 第二个带掩码的 Grabcut 初始化

    【讨论】:

      猜你喜欢
      • 2020-01-17
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多