Grabcut算法出现后输出图像全黑无任何初始化

时间:2018-06-02 15:11:18

标签: opencv image-processing opencv4android

我已经按照this教程在opencv4android中应用抓取切割算法,但我的输出图像与本教程中描述的不一样。事实上,我得到的图像只是黑色。

我得到的输出是这张图片Output image。我使用相同的图像使用toturial 作为输入,但我的输出是黑色的。

1 个答案:

答案 0 :(得分:0)

这是解决你的问题的android opencv中的grabcut代码。

public void grabcutAlgo(Bitmap bit){
      Bitmap b = bit.copy(Bitmap.Config.ARGB_8888, true);
      Point tl=new Point();
      Point br=new Point();
      //GrabCut part
      Mat img = new Mat();
      Utils.bitmapToMat(b, img);
      Imgproc.cvtColor(img, img, Imgproc.COLOR_RGBA2RGB);

      int r = img.rows();
      int c = img.cols();
      Point p1 = new Point(c / 100, r / 100);
      Point p2 = new Point(c - c / 100, r - r / 100);
      Rect rect = new Rect(p1, p2);
      //Rect rect = new Rect(tl, br);
      Mat background = new Mat(img.size(), CvType.CV_8UC3,
        new Scalar(255, 255, 255));
      Mat firstMask = new Mat();
      Mat bgModel = new Mat();
      Mat fgModel = new Mat();
      Mat mask;
      Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(Imgproc.GC_PR_FGD));
      Mat dst = new Mat();


      Imgproc.grabCut(img, firstMask, rect, bgModel, fgModel, 5, Imgproc.GC_INIT_WITH_RECT);
      Core.compare(firstMask, source, firstMask, Core.CMP_EQ);

      Mat foreground = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));

      img.copyTo(foreground, firstMask);

      Scalar color = new Scalar(255, 0, 0, 255);
      Imgproc.rectangle(img, tl, br, color);

      Mat tmp = new Mat();
      Imgproc.resize(background, tmp, img.size());
      background = tmp;
      mask = new Mat(foreground.size(), CvType.CV_8UC1,
        new Scalar(255, 255, 255));

      Imgproc.cvtColor(foreground, mask, Imgproc.COLOR_BGR2GRAY);
      Imgproc.threshold(mask, mask, 254, 255, Imgproc.THRESH_BINARY_INV);
      Mat vals = new Mat(1, 1, CvType.CV_8UC3, new Scalar(0.0));
      background.copyTo(dst);

      background.setTo(vals, mask);

      Core.add(background, foreground, dst, mask);
      Bitmap grabCutImage = Bitmap.createBitmap(dst.cols(), dst.rows(), Bitmap.Config.ARGB_8888);
      Bitmap processedImage = Bitmap.createBitmap(dst.cols(), dst.rows(), Bitmap.Config.RGB_565);
      Utils.matToBitmap(dst, grabCutImage);
      dst.copyTo(sampleImage);
      imageView.setImageBitmap(grabCutImage);
      firstMask.release();
      source.release();
      bgModel.release();
      fgModel.release();
   }