martes, 8 de abril de 2014

Preparando nuestra actividad para recibir los eventos relacionados con la cámara (pasos 8 y 9)

Dejamos el onCreate tal y como se muestra:

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_principal);
  /* Apuntamos a la CameraView que se muestra en la vista de la actividad */
  mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.activity_main_surface_view);
  mOpenCvCameraView.setCvCameraViewListener(this);
 }

Lo que hacemos es lo siguiente:

Ahora implementaremos los eventos "onCameraViewStarted" y "onCameraViewStopped". Éstos nos permitirán crear aquellas superficies de trabajo que necesitemos una única vez cada vez que vayamos a usar la cámara.

Es mejor crear las superficies con las que vayamos a trabajar una única vez y no cada vez que obtengamos un fotograma. De esta manera nuestra aplicación hará un uso menor de la pila (heap) y, por lo tanto, se llamará con menos frecuencia al recolector de basura consiguiendo que nuestra aplicación tenga menos "tirones".

 /* Creamos la superficie (Mat) para almacenar los fotogramas de trabajo (por ahora sólo uno) */
 public void onCameraViewStarted(int width, int height) {
  mFotogramaGrises = new Mat(height, width, CvType.CV_8UC1);
 }

 /* Liberamos los recursos utilizados por las superficies de trabajo (por ahora sólo una) */
 public void onCameraViewStopped() {
  mFotogramaGrises.release();
 }

Con este pequeño código crearemos una imagen donde guardar el resultado de nuestro tratamiento de imagen (será un simple filtro Canny, una imagen en escala de grises de un único canal de 8 bits) cada vez que comencemos a usar la cámara y liberará los recursos asociados cada vez que se pare.

En la próxima entrega, por fin, jugaremos con los fotogramas que nos estregue la cámara.

4 comentarios:

  1. la variable mFotogramaGrises de que tipo es. Agradeceria su respuesta.

    ResponderEliminar
    Respuestas
    1. Tal y como puede deducirse de la creación de la instancia (donde pone "new Mat") y del comentario (donde "Creamos la superficie (Mat) para almacenar") es de tipo Mat:
      http://docs.opencv.org/java/2.4.2/org/opencv/core/Mat.html
      http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-mat

      Eliminar
  2. cuando agrego esto

    mFotogramaGrises = new Mat(height, width, CvType.CV_8UC1);
    }

    mFotogramaGrises.release();
    }

    Imgproc.Canny(inputFrame, mFotogramaGrises, 10, 80);
    return mFotogramaGrises;
    }

    ME MARCA MAL (mFotogramaGrises) EN LAS TRES, POR QUE ?.


    [2016-10-27 14:35:01 - Puzzle15Activity] Unable to resolve target 'android-11'
    [2016-10-27 14:35:01 - CameraCalibrationActivity] Unable to resolve target 'android-11'
    [2016-10-27 14:35:02 - ColorBlobDetectionActivity] Unable to resolve target 'android-11'
    [2016-10-27 14:35:03 - FdActivity] Unable to resolve target 'android-11'
    [2016-10-27 14:35:04 - ImageManipulationsActivity] Unable to resolve target 'android-11'
    [2016-10-27 14:35:05 - CvNativeActivity] Unable to resolve target 'android-11'
    [2016-10-27 14:35:05 - Tutorial1Activity] Unable to resolve target 'android-11'
    [2016-10-27 14:35:06 - Tutorial2Activity] Unable to resolve target 'android-11'
    [2016-10-27 14:35:06 - Tutorial3Activity] Unable to resolve target 'android-11'
    [2016-10-27 16:26:01 - SDK Manager] Error parsing C:\Users\Jesus\.android\devices.xml, backing up to C:\Users\Jesus\.android\devices.xml.old
    [2016-10-27 16:29:09 - B.L.Y.J.G] Error in an XML file: aborting build.

    ResponderEliminar
    Respuestas
    1. mFotogramaGrises es del tipo Mat, por lo que hay que definirla (como propiedad de clase):

      Mat mFotogramaGrises;

      Con eso te dejará de salir esos errores.

      Por cierto, todos esos mensajes de "unable to resolve target 'android-11'" puedes arreglarlos abriendo el archivo "default.properties" y donde pone "target=android-11" pon alguna versión que tengas instalada en tu entorno de desarrollo. Si quieres ver las disponibles vete a "Propiedades/Properties > Android" (puedes sacar el menú, por ejemplo, pulsando el botón derecho sobre cualquier archivo del proyecto en el navegador de archivos o en el menú "Archivo/File").

      Eliminar