Мне удалось исправить мою проблему. Было много проблем с реализацией. Причина, по которой я вывел только выбранную строку GC_FDG
, заключается в том, что все остальное в маске было GC_BGD
. Вместо этого я изменил всю свою маску, чтобы она была заполнена GC_PR_BGD
, а затем пометил детали с помощью GC_FDG
и GC_BGD
.
Это, наконец, создало другую маску, но результат остался прежним. Маска, сгенерированная GrabCut
, была GC_FGD
, которую я аннотировал, GC_PR_BGD
, которая была автоматически сгенерирована grabcut (прогноз моего изображения), выбранным мной GC_BGD
и всем остальным GC_PR_BGD
.
Из-за этого я использовал Core.compare
для генерации соответствующих масок. Мой обновленный код здесь:
Выполнение GrabCut
:
// Get masked from the drawing we made
Mat mask = imageView.mask;
// Create ROI
Rect bounding_box = new Rect(10, 10, mask.cols()-10,
mask.rows()-10);
// Get original image and convert from RGBA to RGB
Mat original_image = new Mat();
Utils.bitmapToMat(imageView.original_bitmap, original_image);
Imgproc.cvtColor(original_image, original_image, Imgproc.COLOR_RGBA2RGB);
// Do extraction
Imgproc.grabCut(original_image, mask, bounding_box, new Mat(), new Mat(),
NUM_ITERATIONS, Imgproc.GC_INIT_WITH_MASK);
// New mask to hold ONLY what was marked GC_PR_FGD by grabcut on our mask.
Mat probable_fgd_mask = new Mat();
Core.compare(mask, new Scalar(Imgproc.GC_PR_FGD), probable_fgd_mask, Core.CMP_EQ);
// Reusing mask variable, store into mask only what was marked as GC_FGD
// inside of mask.
Core.compare(mask, new Scalar(Imgproc.GC_FGD), mask, Core.CMP_EQ);
// Combine both masks so that we have GC_FGD + GC_PR_FGD
Core.add(probable_fgd_mask, mask, mask);
// We will store the foreground into an all-black Mat,
Mat foreground = new Mat(original_image.size(), CvType.CV_8UC1,
new Scalar(0, 0, 0));
// Copy the original image to 'foreground', but mask it with our newly created
// mask (GC_FGD + GC_PR_FGD)
original_image.copyTo(foreground, mask);
, и единственное изменение в коде, который создает маску, - это то, как мы создаем Мат:
ОТ:
mask = new Mat (bmp.getHeight(), bmp.getWidth(), CvType.CV_8U, new Scalar(Imgproc.GC_BGD));
К:
mask = new Mat (bmp.getHeight(), bmp.getWidth(), CvType.CV_8U, new Scalar(Imgproc.GC_PR_BGD));
Надеюсь, это поможет кому-то еще :) Я застрял на этом полтора дня!