Para la detección de rostros he probados dos técnicas, que explicaré a continuación:
-OPENCV: a partir de la versión 3 de OpenCV ya vienen ejemplos de detección detección de rostros mediante clasificadores ya entrenados con mucho éxito.
-DLIB: son unas librerías de C++ que contienen algoritmos de aprendizaje automático y herramientas para facilitar la creación de aplicaciones en C ++ para resolver problemas mediante minería de datos, visión artificial y otras técnicas.
Después de hacer pruebas con ambas técnicas he llegado a la conclusión de que DLIB tiene mejor resuelta la detección de rostros, como veréis en el código en un par de instrucciones se puede realizar, y con un grado de precisión mucho mejor que con OPENCV.
Como curiosidad os indico un link a un video que usa las dos técnicas a la vez (aunque no comparte el código y no podemos saber exactamente cómo de bien lo está haciendo).
Finalmente, he conseguido tener un código en C++ que detecta en tiempo real los rostros presentes en la imagen y me da las coordenadas de los 68 puntos representativos (facial landmark).
En el siguiente artículo analizaré todos los datos mediante Data Mining para ver con qué datos me quedo, aunque supongo que los 68 puntos son el resultado de análisis estadísticos realizados por expertos, y que son el mínimo número de puntos con representatividad.
Os dejo el código para que probéis.
(bajaros primero DLIB, yo uso la v19.0, guardadlo en C:, añadid la variable de entorno, los includes al proyecto visual, etc…)
#include <dlib/image_processing/frontal_face_detector.h> #include <dlib/image_processing/render_face_detections.h> #include <dlib/image_processing.h> #include <dlib/image_transforms.h> #include <dlib/gui_widgets.h> #include <dlib/image_io.h> #include <opencv2/opencv.hpp> #include <opencv2/calib3d.hpp> #include <dlib/opencv.h> #include <dlib/opencv/cv_image.h> #include <opencv2/highgui/highgui.hpp> #include <iostream>using namespace dlib; using namespace std; int main() // Cargamos el predictor y deserializamos el archivo .dat ya entrenado por otra gente (y almacenado en nuestra carpeta) // Creamos la ventana donde se mostrará el video // Comenzamos la detección mediante la webcam // Indicamos el tamaño del frame if (!cap.isOpened()) // Bucle que no acaba hasta que el usuario cierra la ventana. // Aplicamos el detector a la imagen en formato cv_image y obtenemos como resultado el vector faces // Encuentra los puntos de cada rostro y nos muestra las coordenadas (sólo he puesto unos cuantos como muestra) // Muestra el frame // Añade al frame los puntos con circulitos // Esta instrucción mostraría todos los puntos unidos. } |