sábado, 5 de enero de 2013

Preparando la actividad para recibir fotogramas de la cámara (paso 5)

Configurar nuestra Actividad para que implemente CvCameraViewListener

Para que nuestra actividad reciba eventos asíncronos cada vez que reciba un fotograma de la cámara deberemos modificar dos cosas en nuestra actividad.

La primera es agregar a nuestra actividad un elemento llamado "NativeCameraView" que será el encargado de gestionar la comunicación con la cámara Android.

Para ello abriremos el archivo "activity_main.xml" localizado dentro de la ruta "/res/layout/" de nuestro proyecto haciendo doble click sobre él:

Localización archivo activity_main.xml

Al abrir el archivo nos aseguramos que no estamos en "Graphical Layout", deberemos pulsar en la pestaña inferior donde aparece el nombre de archivo (activity_main.xml) y en la parte superior comprobamos que aparece el código XML del aspecto que tendrá la actividad:

Aspecto de activity_principal.xml

En el código XML dereremos cambiar el "TextView" (un simple campo de texto) que viene de ejemplo:

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world" />

Por este otro elemento llamado "org.opencv.android.NativeCameraView":

    <org.opencv.android.NativeCameraView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/activity_main_surface_view" />

Hay que notar que he identificado el elemento org.opencv.android.NativeCameraView con el identificador "activity_main_surface_view" para poder referenciarlo más adelante durante la carga de la aplicación.

El resultado una vez modificado el archivo será algo parecido a:

Ahora deberemos abrir el código de nuestra aplicación buscando en el explorador de paquetes (Package Explorer) el archivo "MainActivity.java" dentro de la ruta "/src/com.linaresdigital.blogrobotica.tutorialopencv1":

Aspecto de activity_principal.xml

En la definición de la clase (del tipo "Activity") nos encontraremos con:

Aspecto de activity_principal.xml

Deberemos agregar, tras "public class MainActivity extends Activity", el texto "implements CvCameraViewListener" para indicar que implementaremos los métodos de invocación asíncrona de obtención de fotogramas que generará nuestro "NativeCameraView" quedando la línea completa de la siguiente manera:

public class MainActivity extends Activity implements CvCameraViewListener {

Ahora Eclipse nos subrayará la palabra "CvCameraViewListener" indicando que existe un error que debe ser corregido:

Error en 'CvCameraViewListener'

Pulsaremos en "Import 'CvCameraViewListener' (org.opencv.android.CameraBridgeViewBase)" para solucionarlo (agregará una línea con el texto "import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;" al comienzo de nuestro código fuente).

Tras hacerlo será ahora la palabra "MainActivity" la que aparecerá resaltada indicándonos un nuevo error que debe ser subsanado:

Error en 'MainActivity'

Esto es debido a que hemos indicado que implementamos la interfaz "CvCameraViewListener" pero no hemos implementado en el código ninguno de sus métodos (en el mensaje nos avisa del método "onCameraViewStarted" en particular).

Lo solucionaremos pulsando en "Add unimplemented methods" (agregar métodos sin implementar) tras lo cual Eclipse creará por nosotros las definiciones de las funciones que aún no hemos implementado listas para insertar código en ellas:

Error en 'MainActivity'

En los puntos 9 y 10 implementaremos todo lo necesario para trabajar con los fotogramas obtenidos.

Ya tenemos casi todo preparado, por ahora agregaremos una propiedad a nuestra clase para almacenar una referencia al control "org.opencv.android.NativeCameraView" que hemos agregado a nuestra actividad:

public class MainActivity extends Activity implements CvCameraViewListener {
        /* Referencia a nuestro control "org.opencv.android.NativeCameraView" */
        private CameraBridgeViewBase mOpenCvCameraView;

De nuevo nos aparecerá otro error resaltando en rojo el tipo de datos "CameraBridgeViewBase" que deberemos solucionar indicando que importe lo necesario pulsando en "Import 'CameraBridgeViewBase' (org.opencv.android)":

Error en 'CameraBridgeViewBase'

Y por último inicializamos nuestra "mOpenCvCameraView" durante el evento onCreate (creación de la actividad):

  /* Al cargar la actividad cargamos el valor de nuestra superficie de trabajo */
  mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.activity_main_surface_view);

El evento onCreate debería quedar tal y como se muestra:

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  /* Al cargar la actividad cargamos el valor de nuestra superficie de trabajo */
  mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.activity_main_surface_view);
 }

No hay comentarios:

Publicar un comentario