Edge refinamiento OpenCV android

Ok, así que soy un novato de opencv, he logrado realizar un grabcut que parece "ok" para mí, excepto los bordes son bastante fuera de forma, quiero obtener bordes realistas, tal vez borrosa los bordes para obtener una imagen perfectamente hecho , Otra cosa que he notado es que los colores tienden a ser demasiado brillante después de todo el proceso que quería reducir la vibración a algo aceptable a continuación es mi código

private Bitmap backGrndErase() { color = new Scalar(255, 0, 0, 255); dst = new Mat(); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.myshirt); Log.d(TAG, "bitmap: " + bitmap.getWidth() + "x" + bitmap.getHeight()); bitmap = ResizeImage.getResizedBitmap(bitmap, calculatePercentage(40, bitmap.getWidth()), calculatePercentage(40, bitmap.getHeight())); bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); Log.d(TAG, "bitmap 8888: " + bitmap.getWidth() + "x" + bitmap.getHeight()); Mat img = new Mat(); Utils.bitmapToMat(bitmap, img); Point p1 = new Point((img.cols()/10), (img.rows()/10)); Point p2 = new Point((img.cols()-img.cols()/10), (img.rows()-img.rows()/10)); Rect rect = new Rect(p1,p2); int border = 20; int border2 = border + border; Rect rect2 = new Rect( border, border, img.cols() - border2, img.rows()-border2); Mat mask = new Mat(); debugger(""+mask.type()); mask.setTo(new Scalar(125)); Mat fgdModel = new Mat(); fgdModel.setTo(new Scalar(255, 255, 255)); Mat bgdModel = new Mat(); bgdModel.setTo(new Scalar(255, 255, 255)); Mat imgC3 = new Mat(); Imgproc.cvtColor(img, imgC3, Imgproc.COLOR_RGBA2RGB); Log.d(TAG, "imgC3: " + imgC3); Log.d(TAG, "Grabcut begins"); Imgproc.grabCut(imgC3, mask, rect2, bgdModel, fgdModel, 2, Imgproc.GC_INIT_WITH_RECT); Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(3.0)); //Do Sth Core.compare(mask, source, mask, Core.CMP_EQ); //Do Sth Mat foreground = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 255, 255)); img.copyTo(foreground, mask); Imgproc.rectangle(img, p1, p2, color); Mat background = new Mat(); try { background = Utils.loadResource(getApplicationContext(), R.drawable.blackcolor ); } catch (IOException e) { e.printStackTrace(); } Mat tmp = new Mat(); Imgproc.resize(background, tmp, img.size()); background = tmp; Mat tempMask = new Mat(foreground.size(), CvType.CV_8UC1, new Scalar(255, 255, 255)); Imgproc.cvtColor(foreground, tempMask, 6/* COLOR_BGR2GRAY */); Mat vals = new Mat(1, 1, CvType.CV_8UC3, new Scalar(0.0)); dst = new Mat(); background.setTo(vals, tempMask); Imgproc.resize(foreground, tmp, mask.size()); foreground = tmp; Core.add(background, foreground, dst, tempMask); Log.d(TAG, "Convert to Bitmap"); //removing blackbaground started Mat tmp2 = new Mat(); Mat alpha = new Mat(); Imgproc.cvtColor(dst, tmp2, Imgproc.COLOR_BGR2GRAY); Imgproc.threshold(tmp2, alpha, 100, 255, Imgproc.THRESH_BINARY); List<Mat> rgb = new ArrayList<Mat>(3); Core.split(dst, rgb); List<Mat> rgba = new ArrayList<Mat>(4); rgba.add(rgb.get(0)); rgba.add(rgb.get(1)); rgba.add(rgb.get(2)); rgba.add(alpha); Core.merge(rgba, dst); Bitmap output = Bitmap.createBitmap(dst.width(), dst.height(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(dst, output); //removing back ended Utils.matToBitmap(dst, bitmap); //release MAT part img.release(); imgC3.release(); mask.release(); fgdModel.release(); bgdModel.release(); alreadyRun = true; return bitmap; } 

He publicado la misma pregunta en el sitio opencv, pero parece que hay poca audiencia en comparación con aquí, las imágenes Mi imagen de salida, si usted mira que usted puede ver que mi salida es demasiado vibrante y muy mal bordes

Mi imagen de entrada

Lo intenté en otra imagen y todavía conseguí el mismo efecto vibrante

Un código de prueba sólo para mostrar algunas posibilidades en torno a su pregunta (suponiendo que el fondo será siempre blanco)

 #include "opencv2/opencv.hpp" using namespace cv; int main(int argc, char** argv) { Mat src= imread( argv[1] ); Mat original = src.clone(); imshow("source", src); src = src + Scalar(40,40,40); // to remove jpeg artifacts Mat mask; cvtColor( src, mask, COLOR_BGR2GRAY ); mask = mask < 255; add(src,Scalar(0,60,20),src,mask); Mat blackbg = Mat::zeros(src.size(),CV_8UC3); original.copyTo( blackbg, mask); imshow("mask", mask); imshow("changed color", src); imshow("original image with black background", blackbg); waitKey(); return 0; } 

Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen

Si desea detectar los bordes o esquinas muy precocemente opencv tiene un conjunto o herramientas de resolución de subpixel, y podría ser una buena idea aplicar un gaussianFilter antes de la detección de bordes, que borran algunos ruidos indeseables

  • Detección de objetos reales utilizando la cámara. Posibilidades de encontrar objetos reales usando cámara
  • ¿Cuándo necesitamos el NDK para OpenCV Android
  • Multithreading en Android
  • ¿Quieres encontrar la longitud focal primero entonces la distancia de la cara detectada en tiempo real utilizando opencv android
  • Uso de funciones nativas en Android con OpenCV
  • Visión por computadora y bibliotecas AR disponibles para Android?
  • Error: 'to_string' no es un miembro de 'std'
  • Girar la vista previa de la cámara a la cámara Android OpenCV
  • OpenCV Native Samples no están construyendo
  • Error: Programa "/ NDK-build" no se encuentra en PATH
  • Multiplicación básica de matriz en OpenCV para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.