Ejemplo de Identificacion de Caras en Java con OpenCV

Ejemplo de Identificacion de Caras en Java con OpenCV

Ejemplo de Identificacion de Caras en Java con OpenCV
4.6 (92.73%) 11 votos

Todos hemos visto como en peliculas de Ciencia Ficcion se identifica a una persona por medio de una Camara y se obtiene en cuestion de pocos segundos su nombre, edad, domicilio y hasta lo que desayuno ese dia 😀 .. si bien no hemos llegado a tanto en este ambito de reconocimiento facial si se ha avanzado un poco, aunque es algo tardado y poco eficiente, podemos ver a continuacion un ejemplo practico en el que podras crearte tu propio programa de Identificacion de caras en java con OpenCV ( fantastica libreria 😉 ) asi que si estas interesado y quieres sentirte parte de una pelicula tipo Minority Report 😀 sigue leyendo …

Requerimientos

Antes de …

Primero que nada decir que el Articulo se basa unicamente en el codigo java basico para lograr la Identificacion de Caras, Reconocimiento Facial, Face Recognition o como quieras llamarle 😉 si tu quieres ( y creo que lo vas a hacer 😀 ) puedes crearte tu Interfaz Grafica, añadir bases de datos, Sistema de Voz, un moño.. en fin, lo que quieras agregarle. Tambien mencionar que este codigo lo tenia hace tiempo ya pero no lo habia subido, algunos comentarios en el blog y a mi correo me pedian ayuda para realizar esto asi que espero y les ayude de algo. Decir tambien que el codigo no es mio, aunque no recuerdo de donde lo saque 🙁 ( era un sitio en Ingles.. para variar en esto de OpenCV ) tiene algunas modificaciones mias en algunas cosas que no Funcionaban o en cosas extras que le agrege.

Hace algun tiempo realize un tutorial de Deteccion de Rostros en Java con Opencv, aunque en realidad lo posicione con el titulo de Reconocimiento de Rostros 😕 no es eso lo que hace realmente ( no se que estaba pensando.. es por eso que este Articulo se llama Identificacion de Caras en Java con OpenCV 😀 ) aquel articulo hablaba sobre como realizar la deteccion simple y facil de caras, este otro en cambio reconoce a que persona corresponde la imagen con el rostro que le es enviada.

Aclarar tambien que necesitamos OpenCV y JavaCV ( link arriba 😀 ) asi como tambien quiza quieras echarle un ojo a el link del Api de la clase FaceRecognizer.

Ahora bien, una vez aclarado algunas cosas vamos a darnos una vuelta por el procedimiento para realizar la Identificacion de Caras..


¿Sabías que?

¿Necesitas aprender algo nuevo ? Ve a Udemy, busca el tema del que quieres aprender, selecciona el curso para ti y continua con tu aprendizaje.

Udemy

El Proceso …

El Proceso basicamente se divide en 2 partes..

  • Entrenamiento
  • Identificacion/Reconocimiento

 

Para el Primero necesitaremos un conjunto de imagenes ( el codigo viene configurado para 10 pero puedes cambiarlo ) del rostro de una persona desde diversas condiciones de luz, despues dentro del codigo a estas imagenes se les pasaran unos filtros y obtendremos unas imagenes formateadas para el correcto aprendizaje de la misma. El Proceso de Reconocimiento de Rostros que hacemos aqui lo hacemos con la clase FaceRecognizer como ya lo sabes, esta clase se ayuda de Patrones de Histogramas, un Histograma viene siendo una representacion que relaciona los niveles de intensidad de una imagen y el numero de pixeles que tienen esa intensidad, ese es el secreto de esta tecnica.

Para la Identificacion o Reconocimiento de caras necesitaremos pasarle una imagen del rostro que quieres detectar ( obviamente que ya haya sido entrenado antes 😎 ) y el codigo obtendra su valor de histograma y comprobara si existe uno en su datamap que este por encima del minimo aceptable establecido, si es asi obtendra el valor de la cadena de texto relacionado a ese valor.

Espero que mas o menos quede claro 😉 ahora vamos con lo que quieres ver.

El Codigo …

Tenemos una estructura de carpetas en C: para realizar las pruebas ( puedes cambiarlo pero ojo! cambia tambien el codigo ) tenemos..

[note]
C:facerecognizerdataimagestraining
[/note]

Nosotros haremos la prueba entrenando el codigo para reconocer a 2 personas, Cristiano Ronaldo y John Terry ( mis jugadores favoritos de Futbol 😮 ) para lo cual necesitaremos 10 imagenes diferentes de el rostro de CR7 y otras 10 de John Terry, ademas otra extra de cada uno tambien diferente para utilizarla para reconocerlos, como se que no quieres perder tiempo buscandolas te las dejo aqui 😉 igual si quieres obtener otras fotos de otras personas puedes ir a Google Imagenes y realizar una busqueda personaliza en “Herramientas de Busqueda” -> “Tipo” -> “Rostros” asi te ahorras tiempo.

Otra cosa es que no necesitas fijarte en el tamaño o que tan cerca esta el rostro ( ojo! que solo aparezca una persona ) ya que el codigo viene con deteccion de rostros en las imagenes que utilizas para el entrenamiento, asi si envias una imagen de una persona cerca o un poco mas lejos el programa te detectara la cara y realizara un recorte, despues la preprocesara.

Ahora que tenemos la estructura de carpetas y las 22 imagenes( 10 y 10 para el entrenamiento / 1 y 1 para el reconomiento ) vamos a ver la estructura del proyecto ..

 

Ejemplo de Identificacion de Caras en Java con OpenCV 1
 

Create el proyecto tal y como luce aqui, mete las imagenes a la raiz de tu proyecto y comienza a escribir la clase Main..

La clase Main luce asi..

Como puedes ver esta bien diferenciada la parte del Entrenamiento de la de Reconocimiento, puedes comentarte la parte de Reconocimiento si solo quieres Entrenar un nuevo Rostro o bien puedes comentar la parte del entrenamiento si lo que quieres una vez entrenado es reconocer un rostro. Puedes ver que yo realizo un entrenamiento de 10 imagenes y que leo el nombre de estas en un ciclo, detecto y preproceso, al final mando aprender la cara. En reconocimiento solo leo una imagen, la imagen objetivo, detecto la cara, preproceso y mando identificar, facil no? 😀 ahora me diras que donde sale la clase ReconocimientoCaras! pues te la dejo: ReconocimientoCaras.java porque no quiero alargar el contenido del articulo 😉

Algunas Imagenes …

Ejemplo de Identificacion de Caras en Java con OpenCV 2
 

Ejemplo de Identificacion de Caras en Java con OpenCV 3

Conclusiones …

Esta es solo una Tecnica de varias que existen, aunque creo que es la mas facil, su eficacia obviamente es algo limitada. Si se utilizan mas samples y se optimizan algunos valores se puede mejorar el porcentaje de acierto aunque tambien decir que su velocidad de reconocimiento es algo tardado, recordar que este es un campo que aun esta en desarrollo 🙂 no querramos descubrir una perla aqui, pero igual es bueno para desarrollo y aplicaciones de exhibición o poco exigidas. No te olvides de regalarme un +1, like, tweet o comentario para saber que estas ahi 😉
[lockercat] Descargar Proyecto Completo[/lockercat]

Ejemplo de Identificacion de Caras en Java con OpenCV

Ejemplo de Identificacion de Caras en Java con OpenCV
4.6 (92.73%) 11 votos

121
Dejar un comentario

avatar
60 Comment threads
61 Thread replies
2 Followers
 
Most reacted comment
Hottest comment thread
56 Comment authors
Juan CarlosEduardoOscar MarinSaidJUAN ALAPE Recent comment authors
  Subscribe  
Notify of
Juan Carlos
Guest
Juan Carlos

hola Jonathan: me podrias indicar con que version de opencv te funciono el codigo. Gracias. por que no me funciona con ninguna.

Eduardo
Guest
Eduardo

hola Jonathan Melgoza como estas?, he estado revidando tu proyecto pero me sale un error en :

private void createModels() {
ptr_binary = createLBPHFaceRecognizer(1, 8, 8, 8, binaryTreshold);
fr_binary = ptr_binary;
}

error: incompatible types: FaceRecognizerPtr cannot be converted to FaceRecognizer

he intentado arreglarlo pero no lo he logrado, me podrías ayudar con una solución, gracias

Said
Guest
Said

Hola Jonathan Melgoza, disculpa estoy trabajando en un sistema de bases de datos en lenguaje php y quiero adaptar el sistema de reconocimiento facial para poder permitir el acceso al sistema por este medio, sabes si existe alguna adaptación para que pueda funcionar con php en la web, de antemano muchas gracias, saludos y bendiciones.

JUAN ALAPE
Guest
JUAN ALAPE

Hola a todos, actualmente trabajo en un proyecto de este tipo pero me salen errores relacionados con el classPath, alguien tiene un código funcional. Muchas gracias mi correo es jjalapeb@uniquindio.edu.co

Oscar Marin
Guest
Oscar Marin

Solucionaste el problema, tengo problemas con su libreria, tengo la libreria opencv mas reciente, y este proyecto la libreria me solicita esta, si descarga la version nueva me dara lo nuevo opencv_objdetect246

Cirilo Linares
Guest
Cirilo Linares

HOla a toda la comunidad de este blog , he podido resolver algunos probemillas , del programa ejemplo, baje la version opencv2.4.9 y copie opencv_core248.dll en el build y en la carpeta java. Pero HORA ME DA ESTE ERROR un: hecho Cargando imagenes para entrenamiento …hecho1. # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_INT_DIVIDE_BY_ZERO (0xc0000094) at pc=0x000007feeae6c00f, pid=2424, tid=4116 # # JRE version: Java(TM) SE Runtime Environment (8.0_91-b15) (build 1.8.0_91-b15) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.91-b15 mixed mode windows-amd64 compressed oops) # Problematic frame: # C [opencv_contrib248.dll+0x3c00f] # #… Read more »

Cirilo Linares
Guest
Cirilo Linares

un: hecho Cargando imagenes para entrenamiento …hecho1. # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_INT_DIVIDE_BY_ZERO (0xc0000094) at pc=0x000007feeae6c00f, pid=2424, tid=4116 # # JRE version: Java(TM) SE Runtime Environment (8.0_91-b15) (build 1.8.0_91-b15) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.91-b15 mixed mode windows-amd64 compressed oops) # Problematic frame: # C [opencv_contrib248.dll+0x3c00f] # # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows # # An error report file with more information is saved as: # C:\reconoce java\reconocimiento de caras en java con Opencv\hs_err_pid2424.log # #… Read more »

Jhon
Guest
Jhon

jhonatan necesito por favor el opencv 2.4.6, no esta disponible para la descarga si pudiera pasarme lo por favor lo necesito con urgencia 🙁 gracias de antemano si eres gentil

Eliezer Daniel
Guest
Eliezer Daniel

amigo pudisteis ejecutar el proyecto este es mi correo escribe por favor eliezerdanielgh1@gmail.com

Eliezer Garcia
Guest
Eliezer Garcia

Hola amigo me sale un error al momento de ejecutar la aplicacion:
OpenCV Error: Parsing error (F:/facerecognizer/data/frBinary.dat(0): Valid XML should start with ”) in icvXMLParse, file ..\..\..\..\opencv\modules\core\src\persistence.cpp, line 2252
java.lang.RuntimeException: ..\..\..\..\opencv\modules\core\src\persistence.cpp:2252: error: (-212) F:/facerecognizer/data/frBinary.dat(0): Valid XML should start with ” in function icvXMLParse

at com.googlecode.javacv.cpp.opencv_contrib$FaceRecognizer.load(Native Method)
at reconocimiento.ReconocimientoCaras.loadTrainingData(ReconocimientoCaras.java:187)
at reconocimiento.ReconocimientoCaras.(ReconocimientoCaras.java:64)
at reconocimiento.ReconocimientoCaras.(ReconocimientoCaras.java:53)
at reconocimiento.Main.main(Main.java:24)

leo
Guest
leo

hola me puedes ayudar me sale el siguiente error.

Exception in thread “main” java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.googlecode.javacpp.Loader.load(Loader.java:553)
at com.googlecode.javacpp.Loader.load(Loader.java:532)
at com.googlecode.javacv.cpp.opencv_objdetect$CvHaarClassifierCascade.(opencv_objdetect.java:170)

Ivan
Guest
Ivan

Bueno, tengo un problema al cargar el haarcascade y asignarselo al CvHaarClassifierCascade
me tira: Invalid Classifier Cascade.

¿A que se debe esto? Talvez el ejemplo es un poco anticuado?

¿Como soluciono esto?

Maribel
Guest
Maribel

Hola me podrias ayudar con un par de dudas no sale el link de javacv

Luis
Guest
Luis

Hola me podes explicar lo que hay en el for donde esta i &lt?

for(int i=1; i < = 10; i++){

Ivan
Guest
Ivan

Pues yo pienso que es como lo escribistes por que vamos a leer “10” imagenes a entrenar por ello necesitamos un bluce el cual podemos usar for para llevar acabo la serie de imagenes a entrenar.
El codigo tiene varios problemas que hay que fijarse y buscarle la logica de lo que dice cada enunciado.

Ivan
Guest
Ivan

Me tira error netbeans en el for de la linea 18 de la clase Main, No entiendo aque te refieres con las expresiones del for:
for(int i=1; i < = 10; i++) //Que significa i< = 10

No se puede encontrar el simbolo: variable: lt
O tratastes de poner: for(int i=1,lt = 10; i <= lt; i++)

everth pintado
Guest
everth pintado

ya solucione lo de antes ahora tengo este problema me podrian ayudar he visto foros y ha varios tienen este problema pero no dicen como resolverlo esta es la descripcion : ” por favor necesito su ayuda ”
nov 07, 2015 7:29:49 AM reconocimiento.Main main
GRAVE: null
java.lang.NullPointerException: This pointer address is NULL.
at com.googlecode.javacv.cpp.opencv_core$CvRect.x(Native Method)
at reconocimiento.ReconocimientoCaras.preprocessImage(ReconocimientoCaras.java:158)
at reconocimiento.Main.main(Main.java:37)

everth pintado
Guest
everth pintado

por favor su apoyo .. me parece que no me reconoce las imagenes guardadas ???

run:
hecho
nulljava.lang.NullPointerException
at reconocimiento.ReconocimientoCaras.detectFace(ReconocimientoCaras.java:95)
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000007feedb01e40, pid=9844, tid=10124
#
# JRE version: Java(TM) SE Runtime Environment (7.0_67-b01) (build 1.7.0_67-b01)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.65-b04 mixed mode windows-amd64 compressed oops)
# Problematic frame:
at reconocimiento.Main.main(Main.java:30)
# C [opencv_core248.dll+0x61e40]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\Everth\Documents\NetBeansProjects\reconocimiento\hs_err_pid9844.log
#

Iván
Guest
Iván

Como lograste resolver este error?

Eliezer Daniel
Guest
Eliezer Daniel

amigo sera que me dices como resolvistes el error este es mi correo eliezerdaniegh1@gmail.com

everth pintado
Guest
everth pintado

su ayuda porfavor , ya solucione varios errores que tenia y me sale esto ?

hecho
java.lang.NullPointerException
at reconocimiento.ReconocimientoCaras.detectFace(ReconocimientoCaras.java:88)
at reconocimiento.Main.main(Main.java:30)

jose
Guest
jose

Que clase de imágenes se utilizan para el entrenamiento de la aplicación, no podrían hacer una con una base de datos para entrenar la aplicacion

Nelson Castiblanco
Guest
Nelson Castiblanco

He vuelto aqui con tu excelente tutorial.. Quisiera preguntarte si haz podido realizar esta aplicacion en Java, pero como se muestra en este video. https://www.youtube.com/watch?v=DaMPjD5MPDE
La idea es que sea en tiempo real. Espero sugerencias, muchas gracias.

Nelson Castiblanco
Guest
Nelson Castiblanco

Aqui hay varios ejemplos: Pero no los comprendo muy bien. https://github.com/bytedeco/javacv

jorge
Guest
jorge

Me sale un error d incompatibilidad de FaceRecognizer a FaceRecognizerPtr no se que pasa por favor si me puedes ayudar

juan jose manriquez santos
Guest
juan jose manriquez santos

Hola 🙂
Cuando llega al metodo “readImages” al parecer no me guarda nada en las posiciones del arreglo images,
se quedan en null todas las posiciones.
¿sabes porque sera?
le estoy pasando la ruta completa + el nombre del archivo y la extencion(.bpm).
Gracias de antemano ;3

Jorge
Guest
Jorge

alguien me puede ayudar para obtener el opencv 2.4.6? creo que solo con esa version funciona… necesito ayuda, es urgente… desde ya gracias!

Jorge
Guest
Jorge

por favor Jhonny, necesito de tu ayuda..