OpenCVForUnity icon indicating copy to clipboard operation
OpenCVForUnity copied to clipboard

grabcut two masks

Open AndreAhmed opened this issue 5 years ago • 1 comments

Hi, I have bought your unity assest. i would like help to create two masks same as the following c++ code.

Please help 👍

 auto create_mask_from_depth = [&](Mat& depth, int thresh, ThresholdTypes type)
   {
       threshold(depth, depth, thresh, 255, type);
       dilate(depth, depth, erode_less);
       erode(depth, depth, erode_more);
   };

       // Generate "near" mask image:
       auto near = frame_to_mat(bw_depth);
       cvtColor(near, near, COLOR_BGR2GRAY);
       // Take just values within range [180-255]
       // These will roughly correspond to near objects due to histogram equalization
       create_mask_from_depth(near, 180, THRESH_BINARY);

       // Generate "far" mask image:
       auto far = frame_to_mat(bw_depth);
       cvtColor(far, far, COLOR_BGR2GRAY);
       far.setTo(255, far == 0); // Note: 0 value does not indicate pixel near the camera, and requires special attention 
       create_mask_from_depth(far, 100, THRESH_BINARY_INV);

       // GrabCut algorithm needs a mask with every pixel marked as either:
       // BGD, FGB, PR_BGD, PR_FGB
       Mat mask;
       mask.create(near.size(), CV_8UC1); 
       mask.setTo(Scalar::all(GC_BGD)); // Set "background" as default guess
       mask.setTo(GC_PR_BGD, far == 0); // Relax this to "probably background" for pixels outside "far" region
       mask.setTo(GC_FGD, near == 255); // Set pixels within the "near" region to "foreground"

       // Run Grab-Cut algorithm:
       Mat bgModel, fgModel; 
       grabCut(color_mat, mask, Rect(), bgModel, fgModel, 1, GC_INIT_WITH_MASK);

       // Extract foreground pixels based on refined mask from the algorithm
       Mat3b foreground = Mat3b::zeros(color_mat.rows, color_mat.cols);
       color_mat.copyTo(foreground, (mask == GC_FGD) | (mask == GC_PR_FGD));

AndreAhmed avatar Nov 22 '20 17:11 AndreAhmed

Here is my trial for one mask

depth.copyTo(maskNear);
          depth.copyTo(maskFar);

          maskNear.convertTo(maskNear, CvType.CV_8U);
          Imgproc.cvtColor(maskNear, maskNear, Imgproc.COLOR_BGRA2BGR);

          Mat erodeElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(4, 4));
          Mat dilateElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(6, 6));

          Imgproc.cvtColor(maskNear, maskNear, Imgproc.COLOR_BGR2GRAY);
          Imgproc.threshold(maskNear, maskNear, 0, 180, Imgproc.THRESH_BINARY);
          Imgproc.dilate(maskNear, maskNear, erodeElement);
          Imgproc.erode(maskNear, maskNear, dilateElement);
            
          convertToGrabCutValues(maskNear);
      
          Mat bgModel = new Mat();
          Mat fgModel = new Mat();

          Imgproc.grabCut(image, maskNear, new OpenCVForUnity.CoreModule.Rect(), bgModel, fgModel, 5, Imgproc.GC_INIT_WITH_MASK);

          convertToGrayScaleValues(maskNear); // back to grayscale values
          Imgproc.threshold(maskNear, maskNear, 128, 255, Imgproc.THRESH_TOZERO);

          Mat foreground = new Mat(image.size(), CvType.CV_8UC4, new Scalar(0, 0, 0));
          image.copyTo(foreground, maskNear);

          Utils.fastMatToTexture2D(image, texture);

AndreAhmed avatar Nov 22 '20 17:11 AndreAhmed