La API de Android ha ido evolucionado rápidamente y cada vez contiene más funcionalidades que hacen que desarrollar sistemas en esta plataforma sea bastante agradable :), una de estas funcionalidades es la de poder detectar rostros en una imagen.
En este tutorial construiremos una aplicación que nos permitirá detectar los rostros de una fotografía y enmarcarlos en un rectángulo. Usaremos Eclipse con el SDK de android instalado y configurado.
Nivel: Básico
Tiempo: 10 minutos
1. Crea un nuevo proyecto en eclipse, llámalo como quieras, en este ejemplo el proyecto se nombro como «TestFace«
2. Nuestra interfaz solamente contara con un ImageView, reemplaza el contenido del activity_main.xml por:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ImageView android:id="@+id/ivPhoto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/sixfaces" /> </LinearLayout>
Recuerda que debes tener una imagen que tenga 1 o más rostros en tu carpeta drawable, en este ejemplo la imagen se llama «sixfaces«.
3. Para terminar debemos escribir el código para detectar los rostros, no es mucho, Android nos facilita esa labor con su API, el código de la clase MainActivity es:
package com.bolivia.testface; import android.media.FaceDetector; import android.media.FaceDetector.Face; import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.PointF; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.util.Log; import android.view.Menu; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView imageView; private final int MAX_FACES_DETECTED = 7;//cantidad maxima de rostros a encontrar //array para guardar rectangulos con la cantidad de rostros encontrados private RectF[] rects = new RectF[MAX_FACES_DETECTED]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = ((ImageView)findViewById(R.id.ivPhoto)); //obtiene imagen BMP del ImageView BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable(); Bitmap bmap = drawable.getBitmap(); //detecta rostros y muestra en el imageView Bitmap bmp_final = detectaRostro(bmap); imageView.setImageBitmap(bmp_final); }//end:onCreate /** * Detecta los rostros de una imagen y pinta un rectangulo sobre ellos * @param Bitmap imagen mapa de bits * @return Bitmap imagen con rostros encontrados * */ public Bitmap detectaRostro(Bitmap bitmap) { //convierte imagen BMP a RGB_565 Bitmap tmpBmp = bitmap.copy(Config.RGB_565, true); //se crea una instancia de FaceDetector del tamaño de la imagen pasando el numero de rostros a buscar FaceDetector faceDetector = new FaceDetector(tmpBmp.getWidth(), tmpBmp.getHeight(), MAX_FACES_DETECTED); //array para guardar los rostros encontrados Face[] faceList = new Face[MAX_FACES_DETECTED]; //busca rostros en la imagen bmp y coloca estos en el array faceDetector.findFaces(tmpBmp, faceList); //recorre el array de rostros for (int i=0; i < faceList.length; i++) { Face face = faceList[i]; if (face != null) {//si se encontraron rostros PointF pf = new PointF(); face.getMidPoint(pf); //se muestra en el LOG Log.d("Rostro encontrado", "Rostro ["+(i+1)+"] - Nivel de confianza ["+face.confidence()+"]" ); Log.d("Detalles rostro", "\t Distacia entre ojos ["+face.eyesDistance()+"] - Punto medio ["+pf.x +","+pf.y +"]"); //Se forma un pequeño rectangulo RectF r = new RectF(); r.left = pf.x - face.eyesDistance() ; r.right = pf.x + face.eyesDistance(); r.top = pf.y - face.eyesDistance(); r.bottom = pf.y + face.eyesDistance(); rects[i] = r; } } //Se pinta un rectangulo rojo en cada rostro detectado Canvas tmpCanvas = new Canvas(bitmap); tmpCanvas.drawBitmap(bitmap, 0, 0, null); Paint rectPaint = new Paint(); rectPaint.setStrokeWidth(8); rectPaint.setColor(Color.RED); rectPaint.setStyle(Style.STROKE); rectPaint.setPathEffect(new DashPathEffect(new float[] {30,10}, 0)); for (int i=0; i < MAX_FACES_DETECTED; i++) { RectF r = rects[i]; if (r != null) tmpCanvas.drawRect(r, rectPaint); } //retorna imagen con rostros detectados return bitmap; } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
El código esta comentado linea por linea y es bastante comprensible, ejecuta y lo que podrás observar en el LogCat es algo como esto:
Si tu imagen no contenía rostros o android no pudo detectarlos veras solo NULL, en tu interfaz podrás ver que los rostros detectados están enmarcados con un rectángulo rojo.
enjoy!!!
Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.
Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye
Enjoy! :)
En este post personalizaremos un componente JComboBox para que sus elementos acepten tablas (JTable) en lugar de texto s...
En este post aprenderemos a usar los gráficos 2d que viene con JavaFX en nuestras aplicaciones java swing. Esto puede se...
En este post crearemos un swing Label personalizado que tendrá la forma circular en su borde, con esto obtendremos un bo...
Continuando con estos post de Cliente/Servidor, en esta oportunidad realizaremos un ejemplo usando un dispositivo móvil...
Nivel: Intermedio-Avanzado IDE: Netbeans 6.9 o Sup. Tiempo: 30 minutos En este tutorial crearemos una aplicación que nos...
SDKMAN! es una herramienta para la administración de versiones paralelas de varios programas de desarrollo de software c...
Los comentarios estan cerrados
Si trabajas con redes sociales (RRSS) a continuación te muestro tres herramintas gratuitas que te ayudaran a la hora de...
Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...
En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...
Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...
Muchas gracias por compartir sus conocimientos, he llegado a este tutorial en la busqueda que estoy haciendo sobre el tratamientos de imagenes en android.
Me gustaria saber si puede orientarme en mi duda. Tengo una imagen de la cual quiero extraer la parte del rostro para luego combinarla con otra o simplemente reemplazar el rostro de la imagen b con el rostro de la imagen a. Como podria implementar esta funcionalidad?
De antemano mis agradecimiento por sus comentarios.
no he estudiado a profundidad el api de android, pero debe tener una funcion para obtener las coordenadas XY de los rostros que detecta, se deben usar esas coordenadas para extraer y reemplazar por una nueva imagen