Cambiar el color de un objeto en una aplicación de Android

Básicamente mi objetivo es cambiar el color del objeto en tiempo real para la aplicación de pintura. Para lograr este objetivo, sigo los siguientes conceptos:

  1. Utilizo el método canny () para encontrar el objeto.
  2. Utilizar findContours () para la detección de bordes.
  3. Utilizando drawContours () para colorear el objeto. Si hay algún otro concepto necesario para lograr la meta, por favor, me sugieren. He intentado pero no conseguir el borde exacto contornos. Entrada original

imagen original

Rendimiento esperado

Rendimiento esperado

Salida de corriente

Obteniendo salida

Estoy recibiendo la imagen en escala de grises, pero quiero en el modo rgb.

Aquí está mi código:

package com.example.imageprocess; import java.util.ArrayList; import java.util.List; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgproc.Imgproc; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.WindowManager; public class MainActivity extends Activity implements CvCameraViewListener2{ private Mat mRgba; private Mat mIntermediateMat; private Mat mGray; private CameraBridgeViewBase mOpenCvCameraView; private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { Log.i("OPENCVACTIVITY", "OpenCV loaded successfully"); // Load native library after(!) OpenCV initialization // System.loadLibrary("mixed_sample"); mOpenCvCameraView.enableView(); } break; default: { super.onManagerConnected(status); } break; } } }; /* public MainActivity() { Log.i("OPENCVACTIVITY", "Instantiated new " + this.getClass()); } */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.activity_main); mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial2_activity_surface_view); mOpenCvCameraView.setCvCameraViewListener(this); } @Override public void onPause() { super.onPause(); if (mOpenCvCameraView != null) mOpenCvCameraView.disableView(); } @Override public void onResume() { super.onResume(); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback); } public void onDestroy() { super.onDestroy(); if (mOpenCvCameraView != null) mOpenCvCameraView.disableView(); } @Override public void onCameraViewStarted(int width, int height) { // TODO Auto-generated method stub mRgba = new Mat(height, width, CvType.CV_8UC4); mIntermediateMat = new Mat(height, width, CvType.CV_8UC4); mGray = new Mat(height, width, CvType.CV_8UC1); } @Override public void onCameraViewStopped() { mRgba.release(); mGray.release(); mIntermediateMat.release(); } @Override public Mat onCameraFrame(CvCameraViewFrame inputFrame) { Mat gaussian_output = new Mat(); mRgba = inputFrame.rgba(); Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 80, 100); Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4); Imgproc.GaussianBlur(mIntermediateMat, gaussian_output, new Size(5, 5), 5); List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); Imgproc.findContours( gaussian_output, contours, new Mat(),Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0) ); Scalar color = new Scalar(165, 30, 215); // Imgproc.drawContours(gaussian_output, contours, -1, color, 3); Mat hierarchy = new Mat(); // find contours: Imgproc.findContours(gaussian_output, contours, hierarchy, Imgproc.RETR_TREE,Imgproc.CHAIN_APPROX_SIMPLE); for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) { Imgproc.drawContours(gaussian_output, contours, contourIdx,color, -1); } return gaussian_output; } } 

Creo que cometió el error de mover la imagen en escala de grises a la imagen coloreada.

Intente: Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_YUV2RGBA_NV21, 4); En lugar de: Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4);

Un poco tarde para la fiesta. No he probado el código, pero sospecho:

 mIntermediateMat = new Mat(height, width, CvType.CV_8UC4); 

A pesar de que mIntermediateMat es 8bit 4 canales aquí,

 Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 80, 100); 

Se convirtió en un 8bit 1 canal aquí. Ref: canny doc .

Mapa de borde de salida; Tiene el mismo tamaño y tipo como imagen.

Como resultado,

 Imgproc.GaussianBlur(mIntermediateMat, gaussian_output, new Size(5, 5), 5); 

Gaussian_output es una malla de 8 canales de 1 canal, y …

 return gaussian_output; 

Devuelve una imagen de 8 bits de 1 canal (escala de grises).

  • El círculo de Hough no detecta los ojos del iris
  • Sobel Edge Detection en Android
  • Error: No se puede obtener un lockedBuffer, el cliente muy probable intenta bloquear más de buffers maxImages
  • No se puede construir caffe en android
  • Detección de elipse con OpenCV
  • Umbral en Android con opencv
  • Cómo desenfocar una parte de la imagen en Android?
  • Procesamiento de fotogramas de cámara Android en tiempo real
  • Convertir imagen JPEG / PNG a formato de imagen TIFF en Android OS
  • Android OpenCV - detectar curvas de Houghlines
  • ¿Es posible cortar un mapa de bits a piezas pequeñas sin cargar toda la cosa en la memoria?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.