Cuando se habla de OpenCV es muy típico de que salga el tema de proyectos de reconocimiento fácil, digamos que es lo básico que uno debe saber cuándo usa esta fantástica librería. Pues bien, como no vamos a ser menos, os enseñaremos como detectar rostros de personas en una imagen.
Aunque este programa es bastante sencillo, es uno de los pilares básico para aprender sobre el procesamiento de imágenes para desarrollar aplicaciones más complejas. Antes de seguir con este tutorial, es recomendado realizar los tutoriales que nos iniciaron en OpenCV, como el tutorial Instalar OpenCV en Windows para poder ser capaces de llegar hasta este punto.
Suponiendo que ya has sido capaz de mostrar una imagen con OpenCV comenzaremos mostrando el código en C++:
#include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include "iostream" using namespace cv; using namespace std; CascadeClassifier face_cascade; int main() { vector<Rect> faces; // Vector para las caras detectadas // Carga el archivo xml para detectar caras: if (!face_cascade.load("C:\opencv\data\haarcascades\haarcascade_frontalface_alt.xml")){ cout << "Cannot load face xml!" << endl; return -1; } Mat src = imread("image.jpg"); // Almacena en la matriz scr la imagen if (src.empty()){ cout << "Cannot load image!" << endl; return -1; } // Pasamos a escala de grises la imagen Mat gray; cvtColor(src, gray, CV_BGR2GRAY); equalizeHist(gray, gray); //imshow("Gray", gray); face_cascade.detectMultiScale(gray, faces, 1.2, 3); // Detectamos las caras presentes en la imagen // Caras for (int i = 0; i < int(faces.size()); i++){ // Repetimos tantas veces como caras detectadas: Rect r = faces[i]; rectangle(src, Point(r.x, r.y), Point(r.x + r.width, r.y + r.height), CV_RGB(0,255,0)); // Marcamos la cara } imshow("Detection", src); // Mostramos la imagen con las caras marcadas waitKey(0); return 0; }
Hay cuatro partes fundamentales en el código que deberemos tener en cuenta:
- La primera es cargar el archivo .xml que tiene los datos necesarios para detectar rostros. No entraremos en detalles que contiene ese archivo. En este tutorial no necesitamos saberlo.
face_cascade.load("C:\opencv\data\haarcascades\haarcascade_frontalface_alt.xml");
- La segunda es cargar nuestra imagen. En próximos artículos lo haremos con un video, pero en definitiva es lo mismo. Recuerda que un video está compuesto por muchas imágenes.
Mat src = imread("image.jpg");
- La tercera parte y una de las más usadas es pasar nuestra imagen a escala de grises. Esto nos permite trabajar con menos información y sobretodo detectar más detalles.
Mat gray; cvtColor(src, gray, CV_BGR2GRAY); equalizeHist(gray, gray);
- Por último, buscaremos en la imagen en escala de grises los rostros y los marcaremos con rectángulos.
face_cascade.detectMultiScale(gray, faces, 1.2, 3); // Detectamos las caras presentes en la imagen // Caras for (int i = 0; i < int(faces.size()); i++){ // Repetimos tantas veces como caras detectadas: Rect r = faces[i]; rectangle(src, Point(r.x, r.y), Point(r.x + r.width, r.y + r.height), CV_RGB(0,255,0)); // Marcamos la cara }
Resultado.
Descargar: Detección de rostro con OpenCV