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:
- Utilizo el método canny () para encontrar el objeto.
- Utilizar findContours () para la detección de bordes.
- 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
- Ajuste de saturación y ColorFilter a la imagen simultáneamente
- Utilizando el array de bytes de la cámara en bruto para la realidad aumentada
- Android cómo hacer la diapositiva de pantalla de imagen?
- Android - openCV, obtener parte de la imagen - comportamiento extraño
- Android: cómo deformar imágenes?
Rendimiento esperado
Salida de corriente
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; } }
- Cómo cambiar el color de fondo de mapa de bits a transparente y de fondo no debe arrastrar?
- Transmisión de cámara en vivo en Android
- OpenCV obtiene píxeles negros dentro del límite del contorno
- Android Yuv420sp a ARGB en OpenCV
- Usando get () y put () para acceder a valores de píxeles en OpenCV para Java
- Biblioteca de OCR para Android
- Encuentra color dominante en un marco de cámara en OpenCV Android
- ¿Cuál es la mejor manera de enviar una imagen desde un dispositivo Android a un servidor para su procesamiento y enviar los resultados?
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).
- Evento OnUp en GestureDetector
- ¿Cuál es el verdadero propósito de la etiqueta contentDescription de Android?