Я использовал алгоритм GrabCut для сегментации моего изображения мое изображение
обнаружить цитрусовые (фрукты) на моем изображении в качестве переднего плана и вычесть их из фона. Для этого сначала я должен выделить 2 точки вокруг моего объекта (фрукты), которые используются для рисования прямоугольника вокруг моего объекта (фрукты), а затем я применяю алгоритм грабчу, чтобы вычесть фон моего изображения. Проблема в том, что я получаю одно и то же изображение обратно (без обнаружения объектов вычитания фона) после применения алгоритма захвата. Ниже - мой код для Android (OpenCV)
public boolean imgProcessingButton(View view) {
if (mCurrentPhotoPath != null)
targetChose = false;
mImageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (touchCount == 0) {
tl.x = event.getX();
tl.y = event.getY();
touchCount++;
}
else if (touchCount == 1) {
br.x = event.getX();
br.y = event.getY();
Paint rectPaint = new Paint();
rectPaint.setARGB(255, 255, 0, 0);
rectPaint.setStyle(Paint.Style.STROKE);
rectPaint.setStrokeWidth(3);
Bitmap tmpBm = Bitmap.createBitmap(mBitmap.getWidth(),
mBitmap.getHeight(), Bitmap.Config.RGB_565);
Canvas tmpCanvas = new Canvas(tmpBm);
tmpCanvas.drawBitmap(mBitmap, 0, 0, null);
tmpCanvas.drawRect(new RectF((float) tl.x, (float) tl.y, (float) br.x, (float) br.y),
rectPaint);
mImageView.setImageDrawable(new BitmapDrawable(getResources(), tmpBm));
targetChose = true;
touchCount = 0;
mImageView.setOnTouchListener(null);
}
}
return true;
}
});
return true;}
public boolean imgCutButton(View view) {
if (mCurrentPhotoPath != null && targetChose) {
new ProcessImageTask().execute();
targetChose = false;
}
return true;
}
private class ProcessImageTask extends AsyncTask<Integer, Integer, Integer> {
@Override
protected void onPreExecute() {
super.onPreExecute();
dlg.setMessage("Processing Image...");
dlg.setCancelable(false);
dlg.setIndeterminate(true);
dlg.show();
}
@Override
protected Integer doInBackground(Integer... params) {
Mat img = Imgcodecs.imread(mCurrentPhotoPath);
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();
Rect rect = new Rect(tl, br);
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);
System.out.println();
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);
firstMask.release();
source.release();
bgModel.release();
fgModel.release();
vals.release();
Imgcodecs.imwrite(mCurrentPhotoPath , dst);
//displayImage(dst);
return 0;
}
@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
Bitmap jpg = BitmapFactory
.decodeFile(mCurrentPhotoPath );
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imageView.setAdjustViewBounds(true);
imageView.setPadding(2, 2, 2, 2);
imageView.setImageBitmap(jpg);
imageView.invalidate();
dlg.dismiss();
}
}