Lo que vamos a hacer aqui, queridos Samurais Informáticos, va a ser montar los cimientos de una
aplicación para Android completamente operativa y equipada con la librería openCV. Con ella vamos
a poder usar, procesar y modificar algoritmos orientados tanto a la adquisición de imágenes como
a su pre, pro y post-proceso. Podremos trabajar con elementos de segmentación, detección de contornos, cálculos de etiquetado, tracking o incluso reconocimiento facial. Una de las características que la hacen especialmente interesante es su apartado dedicado exclusivamente al reconocimiento de patrones por lo que puede ser utilizada tanto en aplicaciones exclusivamente orientadas al proceso de imágenes como a cualquier otra que requiera del uso de algoritmos englobados en la disciplinas del machine learning.

Iron Man Vision HUD

>>>1. Intro al OpenCV

Antes de empezar con el artículo, para poner en materia al interesado que no controla en detalle
la materia, haremos una pequeña referencia al tema principal, La Librería de visión por computador open source openCV. Como su propio nombre indica se trata de un grupo de funciones orientadas a la resolución de problemas típicos de la visión por computador y con una comunidad detrás muy importante de profesionales de la visión que se encarga de mantenerla actualizada.

Un ejemplo de lo que podemos hacer con ella es el del video siguiente donde se usan algoritmos de
Fast Object Tracking.

- una chuleta o Cheat sheet
- Un muy buen libro de open CV: O’Reilly, Learning OpenCV Computer Vision Library de Gary Bradski y Adrian Kaehler.

>>>2. OpenCV y Android

¿Para que vamos a querer utilizar openCV en Android? Principalmente para sacarle partido a la
gran sinergia de elementos que suelen formar el móvil: camara, acceso a internet, pantallas de
gran calidad y procesadores cada vez más potentes. Con estos ingredientes la aplicación de
técnicas de visión por computador se hace casi una obligación. Nuestro principal interés será como de costumbre aplicar este conocimiento al desarrollo de aplicaciones de entretenimiento.

- Reconocimiento de objetos: vehículos.

-Reconocimiento de caras o facial recognition.

– La realidad aumentada no nos la dejamos por el camino, es uno de los motivos principales por los que tocaremos estos temas y sobre el que nos especializaremos en posteriores artículos. De momento y para ir abriendo el apetito, una pequeña referencia.

-Vista de la aplicación de Realidad aumentada.


>>>>>3. Manos a la obra.

Trabajaremos con el entorno de java y la SDK de Android. Para los que no esteis familiarizados con ella pasaros por aqui y echadle un vistazo, en breve tendreis el entorno en marcha.

Una vez listo el entorno, la funcionalidad en la que nos vamos a enfocar será la siguiente:
- Adquisición de la información. (Cámara e Imagen)
- Proceso de los datos. (Aplicación de funciones predefinidas de openCV)
- Muestreo de la información en pantalla.

Con ello tendremos en marcha un proyecto que cubre los cimientos de cualquier aplicación que requiera el uso de la librería open CV.

>>>3.1 El código fuente de ejemplo.

>La base sobre la que trabajaremos la podeis obtener aqui: Test Android OpenCV
>El .apk siempre viene bien. testOpenCV.

>>>3.2 Elementos principales.

Cargaremos la librería y definiremos las estructuras principales mediante:

package com.starcostudios.opencv;

public class OpenCV {
static{
System.loadLibrary("opencv");
}
public native boolean setSourceImage(int[] pixels, int width, int height);
public native byte[] getSourceImage();
}

Montamos el sistema de menus. Podremos o bien hacer la foto o bien seleccionarla de la galería y aplicarle los cambios con la funciones de la librería openCV.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, CAMERA_ID, 0, "Camera");
menu.add(0, GALLERY_ID, 0, "Gallery");
return true;
}

Procesamos la reacción del sistema al escoger una opción u otra.


@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case CAMERA_ID:
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
long timeTaken = System.currentTimeMillis();
mCurrentImagePath = IMAGE_DIRECTORY + "/"
+ Utility.createName(timeTaken) + ".jpg";
Log.i(TAG, mCurrentImagePath);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(mCurrentImagePath)));
startActivityForResult(cameraIntent, ACTIVITY_SELECT_CAMERA);
return true;
case GALLERY_ID:
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
Images.Media.INTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, ACTIVITY_SELECT_IMAGE);
return true;
}

return super.onMenuItemSelected(featureId, item);
}

Finalmente nos enfocamos en la aplicación de las funciones sobre la imagen seleccionada:

try {
Uri currImageURI = data.getData();
String[] proj = { Images.Media.DATA, Images.Media.ORIENTATION };
Cursor cursor = managedQuery(currImageURI, proj, null, null,
null);
int columnIndex = cursor.getColumnIndex(proj[0]);
cursor.moveToFirst();
mCurrentImagePath = cursor.getString(columnIndex);
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentImagePath);
Log.i(TAG, mCurrentImagePath);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
opencv.setSourceImage(pixels, width, height);
long start = System.currentTimeMillis();
opencv.extractSURFFeature();
long end = System.currentTimeMillis();
byte[] imageData = opencv.getSourceImage();
long elapse = end – start;
Toast.makeText(this, “” + elapse + ” ms is used to extract features.”,
Toast.LENGTH_LONG).show();
bitmap = BitmapFactory.decodeByteArray(imageData, 0,
imageData.length);
mImageView.setImageBitmap(bitmap);
} catch (Exception e) {
}

Es importante tener en cuenta las estructuras que intervienen en el proceso ya que al pasar por diferentes mecanismos nos debemos ajustar a las estructuras de datos que se utilizan en cada estado del proceso.

En resumen, hemos sentado las bases del uso de OpenCV en Android pudiendo utilizar todas las funciones de la librería con lo que tenemos la capacidad de aplicar los últimos algoritmos en materia de Visión por Computador
para nuestras aplicaciones con Android. Posteriormente veremos como pasar por las diferentes fases propias de las aplicación de visión por computador pre, pro y postproceso.

Hasta la próxima!