OpenCV в Java Imgproc GC_INIT_WITH_MASK дает странные результаты - PullRequest
1 голос
/ 03 ноября 2019

При первой сегментации я сделал это с помощью 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.

Первый снимок с прямоугольником

Результатgrabcut с маской

* красная маркировка - это GC_BGD, которая является уверенным фоном

* синяя маркировка - это GC_FGD, которая является уверенной на переднем плане

...