Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Android / Detección de rostros con android

Detección de rostros con android

Autor jc mouse viernes, diciembre 12, 2014

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

android rostros

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:

log cat

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.

omg

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

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! :)

También Te Podría Interesar

Compartir texto plano con un ShareActionProvider en Android

Compartir texto plano con un ShareActionProvider en Android

Un Action Provider es un elemento que habita en la Action Bar para incrementar la accesibilidad de nuestras aplicaciones...

Generador de números aleatorios UNIX

Generador de números aleatorios UNIX

El Método Congruencial Lineal Mixto es el más utilizado en simulación en computadoras digitales y esta basado en una rel...

Matriz de Adyacencia: Representación de grafos en Java

Matriz de Adyacencia: Representación de grafos en Java

En este post conoceremos una forma de representar grafos mediante una Matriz de Adyacencia y un ejemplo básico de este e...

TextToSpeech: Convierte texto a voz

TextToSpeech: Convierte texto a voz

TextToSpeech o TTS, es el sintetizador de voz para android, en los celulares inteligentes viene un motor TTS por defecto...

Uso de BitmapFont en LibGDX

Uso de BitmapFont en LibGDX

En este tutorial conoceremos lo que es el uso de BitmapFont en LibGDX y algún uso que le podemos dar como crear un menú,...

Gestión de Stock – La Vista (Parte 3)

Gestión de Stock – La Vista (Parte 3)

En esta tercera parte del tutorial crearemos la interfaz de usuario GUI (VISTA) para el sistema de gestión de stock. Tom...

2 comentarios en “Detección de rostros con android”

  1. Fernando dice:

    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.

    1. Mouse dice:

      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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Comparte lo que sabes

Categorias

Últimas entradas

Una Prueba Unitaria, es una forma de comprobar que nuestro código, hace lo que se supone debe hacer; es decir, se asegur...

La prueba del camino básico, es una prueba de “caja blanca” que consiste en verificar el código de nuestros...

Si quieres cambiar el nombre de tus atributos sin tener que reescribir código java por X o Y razón, GSON te permite reno...

Un JList nos permite almacenar objetos en una lista y mostrarlos gráficamente en una serie vertical en el cual el usuari...

Android Bolivia

Bandera en Alto