Reconocimiento facial con OpenCV

Seguramente habrás visto en multitud de peliculas de ciencia-ficción, como Minority Report, un software futurista el cual era capaz de identificar en una videocámara, a través de la cara del sujeto captado, todos sus datos personales. Su nombre, su domicilio, su trabajo, cómo se llama su mujer, donde está actualmente geolocalizado... Por desgracia, la tecnología no ha llegado hasta tal punto, pero se han hecho importantes avances que puedes probar tú mismo. El reconocimiento facial ya está aquí. Lo habrás visto en cámaras compactas y réflex las cuales ejecutan el disparo cuando identifican una sonrisa. También te habrás topado con esta tecnología en distintas redes sociales como Facebook, la cual también es capaz de identificar caras para etiquetar a las distintas personas que aparecen en la foto. Como nosotros no íbamos a ser menos, te traemos un artículo en el cual te explicamos cómo reconocer una cara con Java, gracias a la librería OpenCV. ¿Estás preparado? ¡Pues en marcha!

Antes de nada, decirte que para utilizar lo que te vamos a explicar hoy necesitas tener OpenCV instalado en tu equipo y Eclipse, claro está. Una vez estamos seguros de cumplir con estos requerimientos, comenzamos con la faena.

Lo primero de todo será crear un nuevo proyecto. Para ello nos vamos a Eclipse y hacemos clic en File > New > Java Project y le damos nombre al proyecto, que en nuestro caso será CarasOpenCV-Java. A continuación creamos un nuevo paquete, al cual podemos llamar como nosotros queramos. En nuestro caso se llamará reconocimiento. Una vez tenemos todo listo, concebimos una nueva clase dentro de nuestro paquete la cual llamaremos Main (vosotros podéis llamarla como queráis).

Agregando la librería OpenCV

Por supuesto, vamos a agregar la librería OpenCV a nuestro proyecto haciendo clic derecho sobre el workspace y seleccionando Properties > Java Build Path. Añadimos una nueva librería mediante el botón Add Library. Después le indicamos al editor que queremos seleccionar una de nuestras librerías haciendo clic en User Library y después pulsamos en Next. Ahora pinchamos en New..., escribimos el nombre de la librería que queremos utilizar, en este caso OpenCV-2.4.6, y aceptamos. Ahora hay que agregar el jar de la librería que queremos utilizar para reconocer caras. Hacemos clic en Add External Jar, vamos a buildjava y seleccionamos la librería, que en este caso sería opencv-256.jar.

Ya solo quedaría indicar dónde se encuentra la librería nativa. Solo tenemos que hacer doble click sobre native Library Location y seleccionar la ruta buildjavax86 en el caso que tu equipo sea de 32 bits, o buildjavax64 en el caso de que tu equipo sea de 64 bits. Lo aceptamos todo y continuamos con el proyecto una vez hemos insertado la librería.

Cómo realizar el reconocimiento facial

A continuación abrimos el proyecto y creamos un nuevo directorio para los recursos. En nuestro caso subiremos dos archivos, uno llamado cara.jpg que contendrá una imagen con una cara de una persona, y otro llamado lbpcascade_frontalface.xml con permisos de escritura, el cual debes ubicar en el directorio de opencv en datalbpcascades.

Una vez realizado todo esto, solo queda escribir este snippet dentro de la clase que hemos creado anteriormente.

package reconocimiento;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;

class DetCara {
public void run() {

CascadeClassifier faceDetector = new CascadeClassifier("C:/Users/programacionnet/workspace/CarasOpenCV-Java/recursos/lbpcascade_frontalface.xml");
Mat image = Highgui.imread("C:/Users/programacionnet/workspace/CarasOpenCV-Java/recursos/cara.jpg");

MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);

System.out.println(String.format("Hay %s caras", faceDetections.toArray().length));

for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 255, 255));
}

String filename = "caradetectada.png";
System.out.println(String.format("Imagen %s generada", filename));
Highgui.imwrite(filename, image);
}
}

public class Main {
public static void main(String[] args) {
System.loadLibrary("opencv_java246");
new DetCara().run();
}
}

Al ejecutar este pequeño programa, se te generará una imagen nueva la cual tendrá el mismo contenido que la imagen que has subido anteriormente al directorio de recursos, pero con una gran diferencia. La nueva imagen contará con un cuadrado blanco que enmarcará la cara de la imagen cara.jpg, reconociéndola.

Esperamos que este artículo haya sido de tu agrado y que te haya sido de ayuda para algún proyecto. Por nuestra parte seguiremos echándote una mano en todo lo que esté en nuestro alcance. No olvides que puedes comentar en los foros por si tienes alguna duda que nos sabes resolver.

Volviendo al tema de inicio, ¿cuál es tu película de ciencia-ficción preferida?

 

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP