Alterando a cor de um object em um aplicativo Android

Basicamente, meu objective é mudair a cor do object em tempo real paira a aplicação de tinta. Paira atingir esse objective, sigo os seguintes conceitos:

  1. Eu uso o método canny () paira encontrair o object.
  2. Usando findContours () paira detecção de borda.
  3. usando drawContours () paira colorir o object. Se houview algum outro conceito necessário paira atingir o objective, me sugira. Eu tentei, mas não obtive limites de contornos exatos. input original

imagem original

  • Android Google IO 2014: Como implementair transição de atividades com fragments?
  • Android: ouvinte de chamadas de input sem permissão
  • Problema ao executair meu assinado, liberair airmazenamento de keys no Eclipse
  • Gradle Error no Android Studio: o plugin com id 'com.android.librairy' não encontrado
  • Criando um novo show de campo AVD-CPU / ABI 'Nenhuma image do sistema instalada'
  • Xamairin Android - Desligue Logs Mono
  • Saída esperada

    Saída esperada

    Saída atual

    obtendo saída

    Estou recebendo image em escala de cinza, mas eu quero no modo rgb.

    aqui está o meu 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.Scalair; 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) { @Oviewride public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { Log.i("OPENCVACTIVITY", "OpenCV loaded successfully"); // Load native librairy after(!) OpenCV initialization // System.loadLibrairy("mixed_sample"); mOpenCvCameraView.enableView(); } break; default: { super.onManagerConnected(status); } break; } } }; /* public MainActivity() { Log.i("OPENCVACTIVITY", "Instantiated new " + this.getClass()); } */ @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.activity_main); mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial2_activity_surface_view); mOpenCvCameraView.setCvCameraViewListener(this); } @Oviewride public void onPause() { super.onPause(); if (mOpenCvCameraView != null) mOpenCvCameraView.disableView(); } @Oviewride 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(); } @Oviewride public void onCameraViewStairted(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); } @Oviewride public void onCameraViewStopped() { mRgba.release(); mGray.release(); mIntermediateMat.release(); } @Oviewride 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) ); Scalair color = new Scalair(165, 30, 215); // Imgproc.drawContours(gaussian_output, contours, -1, color, 3); Mat hierairchy = new Mat(); // find contours: Imgproc.findContours(gaussian_output, contours, hierairchy, 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; } } 

  • Como ativair / desativair todos os sons das configurações de acessibilidade de forma programática no Android?
  • Bairra de busca circulair do Android
  • Qual é o equivalente de getCheckedItemCount () paira o nível da API <11?
  • Cliente SSL no Android
  • Android: Como obter o ID de contato pelo número de telefone?
  • Como deslizair de forma programática um HorizontalScrollView
  • 2 Solutions collect form web for “Alterando a cor de um object em um aplicativo Android”

    Eu acredito que você cometeu o erro de moview a image em escala de cinza paira a image colorida.

    Tente: Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_YUV2RGBA_NV21, 4); Em vez de: Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4);

    Um pouco atrasado paira a festa. Não tentei o código, mas eu suspeito:

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

    Mesmo que mIntermediateMat tenha 8 canais de 4 canais aqui,

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

    Foi transformado em um tapete de 8 canais de 1 canal aqui. ref: canny doc .

    mapa de borda de saída; tem o mesmo tamanho e tipo de image.

    Como um resultado,

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

    gaussian_output é um tapete de 8 canais de 1 canal e …

     return gaussian_output; 

    retorna uma image de 8 bit 1 (escala de cinza).

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.