Java Imgproc的OpenCV的GC_INIT_WITH_MASK给出奇怪的结果

时间:2019-11-03 05:36:26

标签: java android opencv mask image-segmentation

在第一次分割时,我使用GC_INIT_WITH_RECT进行了处理,并且工作正常。但是在第二个细分中,我使用了GC_INIT_WITH_MASK,但这给了我奇怪的结果。

创建了一个新的遮罩newmask,并用GC_PR_BGD(可能是背景)填充了它。

    newmask = new Mat(bitmapImage.getHeight(), bitmapImage.getWidth(), CvType.CV_8UC1, new Scalar(Imgproc.GC_PR_BGD));

我有一块画布,可以在其中以图像为视觉参考在蒙版上绘画。我有一个将gcColor更改为GC_PR_FGD,GC_FGD和GC_BGD的按钮。这样,我就可以标记图像的可能前景,确定前景和确定背景。

if (count == 0) {
        paintDraw.setColor(Color.BLACK);
        gcColor = new Scalar(Imgproc.GC_PR_FGD);
    } else if (count == 1) {
        paintDraw.setColor(Color.BLUE);
        gcColor = new Scalar(Imgproc.GC_FGD);
    } else if (count == 2) {
        paintDraw.setColor(Color.RED);
        gcColor = new Scalar(Imgproc.GC_BGD);
    }

借鉴newmask

Imgproc.circle(newmask, nm, 10, gcColor, 10); //nm being the Point

带有蒙版的抓取代码:

    Bitmap bmp = bitmapImage;

    Mat img = new Mat();
    Bitmap bmp32 = bmp.copy(Bitmap.Config.RGB_565, true);
    Utils.bitmapToMat(bmp32, img);
    Imgproc.cvtColor(img, img, Imgproc.COLOR_BGRA2BGR);

    // Up to this point: Bitmap is converted to Mat and removes alpha channel

    Mat background = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));
    Mat bgModel = new Mat();
    Mat fgModel = new Mat();

    Mat source = new Mat(1, 1, CvType.CV_8UC3, new Scalar(Imgproc.GC_PR_FGD));
    Mat dst = new Mat();

    Rect rect = new Rect(tl, br); // rect coordinates from previous segmentation

    Imgproc.grabCut(img, newmask, rect, bgModel, fgModel, 1, Imgproc.GC_INIT_WITH_MASK);

    Core.compare(newmask, source, newmask, Core.CMP_EQ);

    Mat segmentedImg= new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));
    img.copyTo(segmentedImg, newmask); //segmented image stored in segmentedImg as a Mat

据我了解,rect以外的所有内容都被标记为背景。但是,当我取回分割的图像时,rect之外的区域也受到了GC_INIT_WITH_MASK的影响。

First grabcut with rect

Result of grabcut with mask

*红色标记是GC_BGD,可以确定背景

*蓝色标记是GC_FGD,可以肯定是前景

0 个答案:

没有答案